Помогите с выборкой

ugodrus

Есть таблица
------+------+------
 t1 | t2 | t3 
------+------+------
t1 = int(<b>2</b>)
t2 = varchar(<b>16</b>)
t3 = varchar(<b>100</b>)
primary key (t1,t2);
для каждого t1 может дублироваться t2t1 = 0 - содержит полный список значений t2ЗАДАЧА : выбрать все t2,t3 где t1 = 0 и t1 = N но не просто, а с накладкой забрать все возможные t2 и t3 доступные с t1 = N а то чего в этом списке нехватает дополнить значениями t2, t3 при t1 = 0
14 ответов

ugodrus

primary key (t1,t2);
для каждого t1 может дублироваться t2
Вы сами себе противоречите. Опишите подробнее задачу.


ugodrus

уточняю: для каждого значения t1 одно уникальное t2, нов t1>0 присутствуют некоторые t2 из списка с t1 = 0


ugodrus

примерно так:
SELECT IFNULL(b.t2,a.t2), IFNULL(b.t3,a.t3)
FROM my_table a
 LEFT OUTER JOIN my_table b ON a.t2=b.t2
WHERE a.t1=<b>0</b> AND b.t1=N


ugodrus

miksoft , не то... при таком запросе выдает все что для t1 = n что равнозначно более простомуselect t2,t3 where t1 = n
========== простенький пример таблицы
+-----+-----+-----+
| t1 | t2 | t3 |
+-----+-----+-----+
| <b>0</b> | <b>1</b> | <b>0</b> |
| <b>0</b> | <b>2</b> | <b>0</b> |
| <b>0</b> | <b>3</b> | <b>0</b> |
| <b>0</b> | <b>4</b> | <b>0</b> |
| <b>0</b> | <b>5</b> | <b>0</b> |
| <b>1</b> | <b>1</b> | <b>1</b> |
| <b>1</b> | <b>4</b> | <b>1</b> |
| <b>1</b> | <b>5</b> | <b>1</b> |
| <b>2</b> | <b>1</b> | <b>2</b> |
| <b>2</b> | <b>2</b> | <b>2</b> |
| <b>2</b> | <b>5</b> | <b>2</b> |
| <b>3</b> | <b>3</b> | <b>3</b> |
| <b>3</b> | <b>5</b> | <b>3</b> |
| <b>4</b> | <b>2</b> | <b>4</b> |
| <b>4</b> | <b>4</b> | <b>4</b> |
| <b>5</b> | <b>1</b> | <b>5</b> |
| <b>5</b> | <b>5</b> | <b>5</b> |
+-----+-----+-----+
========== это то, что должно получиться для выборки для t1 = <b>4</b>
+-----+-----+
| var | val |
+-----+-----+
| <b>1</b> | <b>0</b> |
| <b>2</b> | <b>4</b> |
| <b>3</b> | <b>0</b> |
| <b>4</b> | <b>4</b> |
| <b>5</b> | <b>0</b> |
+-----+-----+


ugodrus

сорри, болею...а так:
SELECT IFNULL(b.t2,a.t2), IFNULL(b.t3,a.t3)
FROM (SELECT t2,t3 FROM my_table
WHERE t1=<b>0</b>) a LEFT OUTER JOIN 
(
 SELECT t2,t3
 FROM my_table
 WHERE t1=N
) b ON a.t2=b.t2
?


ugodrus

ошибка начиная отсюда
SELECT t2,t3 FROM my_table ...


ugodrus

ошибка начиная отсюда
SELECT t2,t3 FROM my_table ...
Не вижу ошибки, даже несмотря на то, что кто-то изменил форматирование моего запроса.


ugodrus

Кстати, а версия MySQL какая?Если 4.0 или старее, то, действительно, будет ошибка, т.к. эти версии не поддерживают подзапросы.


ugodrus

[root@localhost:<b>3306</b>] ERROR <b>1064</b>: You have an error in your SQL syntax. 
Check the manual that corresponds to your MySQL server version for the right
syntax to use near 
'SELECT t2,t3 FROM my_table
WHERE t1=<b>0</b>) a LEFT OUTER JOIN 
(
 S


ugodrus

вот я про то же... подзапросы не идут. версии 4.0.13 и 4.0.27(вроде) вобщем обе они под старым клиентом работаютхостер не в состоянии поставить пятерку


ugodrus

можно конечно с временной таблицей попариться, но не охота т.е. создать ее с ключём по t2 и начинать впихивать с T1 = N затем t1=0 дубликаты сами собой отвалятся


ugodrus

create temporary table temp1 as (тут подзапрос)select .... left join temp1


ugodrus

а так:
SELECT IFNULL(b.t2,a.t2), IFNULL(b.t3,a.t3)
FROM my_table a LEFT OUTER JOIN my_table b ON a.t1+N=b.t1 AND a.t2=b.t2
WHERE a.t1=<b>0</b>
?


ugodrus

ВООООООТ... что и требовалосьОГРОМЕННОЕ СПАСИБОработает