SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 28.10.2011 09:57:36

LazY
_cмельчак
MySQL Authorized Developer and DBA
Зарегистрирован: 02.04.2007
Сообщений: 849

как сделать полный LEFT JOIN для каждого сегмента таблицы

Есть две таблицы:

Код:

mysql> SELECT * FROM a;
+----+-----------+
| id | parent_id |
+----+-----------+
|  1 |         0 |
|  2 |         0 |
|  3 |         0 |
|  4 |         0 |
+----+-----------+

mysql> SELECT * FROM links;
+------+------+
| a_id | b_id |
+------+------+
|    1 |   20 |
|    2 |   20 |
|    3 |   20 |
|    1 |   30 |
+------+------+

Соответственно, LEFT JOIN дает:

Код:

mysql> SELECT a.id, l.b_id
    -> FROM a
    -> LEFT JOIN links l ON a.id = l.a_id
    -> WHERE a.parent_id = 0;
+----+------+
| id | b_id |
+----+------+
|  1 |   20 |
|  2 |   20 |
|  3 |   20 |
|  4 | NULL |
|  1 |   30 |
+----+------+

Что-то не пойму, как сделать запрос, который даст следующее:

Код:

+----+------+
| id | b_id |
+----+------+
|  1 |   20 |
|  2 |   20 |
|  3 |   20 |
|  4 | NULL |
|  1 |   30 |
|  2 | NULL |
|  3 | NULL |
|  4 | NULL |
+----+------+

?

Вообще конечная задача - найти все записи из таблицы a, которые имеют полный набор соответствий определенной выборке из другой таблицы (частный случай: найти такие записи, у которые есть связи с полным набором записей из другой таблицы, без пропусков).
Я её хотел решить через подобный JOIN и выяснение наличия NULL-записей.
Можно через COUNT, но тогда одним запросом не получится (или же получится не очень красиво - сначала надо выяснить количество записей в главной таблице, чтобы знать, с чем сравнивать COUNT).

Неактивен

 

#2 28.10.2011 11:38:16

Neval
Гуру
Откуда: Киев
Зарегистрирован: 11.03.2008
Сообщений: 449

Re: как сделать полный LEFT JOIN для каждого сегмента таблицы

А без JOIN не пробовали играться? Старый добрый "FROM x, y" как раз все записи таблиц и сравнивает. В случае с JOIN запрос конечно будет не простой smile


Человек без чувства юмора - не серьёзный человек wink

Неактивен

 

#3 30.10.2011 22:06:59

LazY
_cмельчак
MySQL Authorized Developer and DBA
Зарегистрирован: 02.04.2007
Сообщений: 849

Re: как сделать полный LEFT JOIN для каждого сегмента таблицы

FROM x, y - это все равно, что INNER JOIN.
Он не даст нужного результата, т.к. заведомо отсечет все записи из a, которых нет в links.

Неактивен

 

#4 27.11.2011 22:02:19

vinslave
Участник
MySQL Authorized Developer
Зарегистрирован: 16.10.2011
Сообщений: 15

Re: как сделать полный LEFT JOIN для каждого сегмента таблицы

так тебе OUTER JOIN нужен? Тогда сделай комбинацию из LEFT и RIGTH JOIN и объедини результат с помощью UNION

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson