|
|
|
| Есть 2 таблицы
в первой содержится список товаров, во второй есть поле tovar, там находится id соответствующего товара из первой таблицы.
Гарантируется что в первой таблице всегда найдётся товар, id которого нет в поле tovar таблицы №2 .
Как сделать выборку из первой таблицы всех тех товаров, которых нет в таблице №2? | |
|
|
|
|
|
|
|
для: Keyses
(13.01.2010 в 15:42)
| | Как сделать выборку соответствия из обеих таблиц - представляете? LEFT JOIN .. ON ..
Так вот, у Вас тот же LEFT JOIN , но только с отловом полей NULL таблицы 2. | |
|
|
|
|
|
|
|
для: Trianon
(13.01.2010 в 15:50)
| | Можно простенький пример, потому что у меня что-то не получается :( | |
|
|
|
|
|
|
|
для: Keyses
(13.01.2010 в 16:07)
| | Конечно. Но приводить пример будете Вы.
А если будут ошибки - вместе поправим. | |
|
|
|
|
|
|
|
для: Trianon
(13.01.2010 в 16:10)
| | SELECT * FROM СПИСОК ТОВАРОВ scc
LEFT JOIN ТАБЛИЦА_2 sr ON sr.tovar IS NULL | |
|
|
|
|
|
|
|
для: Keyses
(13.01.2010 в 16:14)
| | В разделе ON пишется условие равенства полей таблиц. То самое, которое определяет ключевую зависимость.
а условие st.tovar IS NULL пишется отдельно, в разделе WHERE | |
|
|
|
|
|
|
|
для: Trianon
(13.01.2010 в 16:19)
| | всё равно не получается.
spisok
- id
- name
table_2
- id
- param
- tovar
Надо составить запрос где будут выбираться spisok.id которых нет в table_2.tovar, при условии что table_2.param = 11.
я делаю так
SELECT * FROM spisok sp
LEFT JOIN table_2 t2 ON (t2.tovar = sp.id)
WHERE t2.tovar IS NULL AND t2.param = 11
Как правильно? | |
|
|
|
|
|
|
|
для: Keyses
(13.01.2010 в 16:36)
| | Если строк в t2 нет, то о каком param может идти речь?
Еще раз.
Сперва составьте LEFT JOIN запрос, который выводит строки, которые есть.
Безо всякого IS NULL.
Только потом, когда такой запрос выдаст нужный результат - переделывайте его в запрос, возвращающий отсутствующие строки.
А то непонятно, отсутствие каких строк Вы хотите зафиксировать. | |
|
|
|
|
|
|
|
для: Trianon
(13.01.2010 в 16:42)
| | SELECT * FROM spisok sp
LEFT JOIN table_2 t2 ON (t2.tovar = sp.id)
WHERE t2.param = 11
Если делать так, то в t2.tovar я получаю набор строк который надо исключить из sp.id и получить результат.
:( может я не понятно поясняю что именно мне нужно? | |
|
|
|
|
|
|
|
для: Keyses
(13.01.2010 в 16:49)
| | SELECT * FROM spisok sp
>LEFT JOIN table_2 t2 ON (t2.tovar = sp.id)
>WHERE t2.param = 11
Фактически это значит, что t2.param = 11 - это часть условия соединения.
Перенесите эту часть из раздела WHERE в условие соединения ON , записав условие через AND , так что WHERE оказывается не нужен.
Получаете тот же список.
После этого добавляете проверку NULL в раздел WHERE и получаете список исключений.
>:( может я не понятно поясняю что именно мне нужно?
Простите, кто кому поясняет? | |
|
|
|
|
|
|
|
для: Trianon
(13.01.2010 в 16:58)
| | Я поясняю что мне нужно, вы поясняете как это правильно реализовать :)
Разобрался. Помогло RIGHT JOIN | |
|
|
|
|
|
|
|
для: Keyses
(13.01.2010 в 20:59)
| | >Разобрался. Помогло RIGHT JOIN
RIGHT от LEFT только порядком связи таблиц отличается.
Не нужен тут RIGHT - это вообще редкость.
SELECT *
FROM spisok sp
LEFT JOIN table_2 t2 ON (t2.tovar = sp.id AND t2.param = 11)
WHERE t2.tovar IS NULL
|
| |
|
|
|