Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Вопрос по составлению запроса
 
 автор: Keyses   (13.01.2010 в 15:42)   письмо автору
 
 

Есть 2 таблицы

в первой содержится список товаров, во второй есть поле tovar, там находится id соответствующего товара из первой таблицы.

Гарантируется что в первой таблице всегда найдётся товар, id которого нет в поле tovar таблицы №2 .

Как сделать выборку из первой таблицы всех тех товаров, которых нет в таблице №2?

  Ответить  
 
 автор: Trianon   (13.01.2010 в 15:50)   письмо автору
 
   для: Keyses   (13.01.2010 в 15:42)
 

Как сделать выборку соответствия из обеих таблиц - представляете? LEFT JOIN .. ON ..
Так вот, у Вас тот же LEFT JOIN , но только с отловом полей NULL таблицы 2.

  Ответить  
 
 автор: Keyses   (13.01.2010 в 16:07)   письмо автору
 
   для: Trianon   (13.01.2010 в 15:50)
 

Можно простенький пример, потому что у меня что-то не получается :(

  Ответить  
 
 автор: Trianon   (13.01.2010 в 16:10)   письмо автору
 
   для: Keyses   (13.01.2010 в 16:07)
 

Конечно. Но приводить пример будете Вы.
А если будут ошибки - вместе поправим.

  Ответить  
 
 автор: Keyses   (13.01.2010 в 16:14)   письмо автору
 
   для: Trianon   (13.01.2010 в 16:10)
 

SELECT * FROM СПИСОК ТОВАРОВ scc
LEFT JOIN ТАБЛИЦА_2 sr ON sr.tovar IS NULL

  Ответить  
 
 автор: Trianon   (13.01.2010 в 16:19)   письмо автору
 
   для: Keyses   (13.01.2010 в 16:14)
 

В разделе ON пишется условие равенства полей таблиц. То самое, которое определяет ключевую зависимость.
а условие st.tovar IS NULL пишется отдельно, в разделе WHERE

  Ответить  
 
 автор: Keyses   (13.01.2010 в 16:36)   письмо автору
 
   для: 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

Как правильно?

  Ответить  
 
 автор: Trianon   (13.01.2010 в 16:42)   письмо автору
 
   для: Keyses   (13.01.2010 в 16:36)
 

Если строк в t2 нет, то о каком param может идти речь?

Еще раз.
Сперва составьте LEFT JOIN запрос, который выводит строки, которые есть.
Безо всякого IS NULL.
Только потом, когда такой запрос выдаст нужный результат - переделывайте его в запрос, возвращающий отсутствующие строки.
А то непонятно, отсутствие каких строк Вы хотите зафиксировать.

  Ответить  
 
 автор: Keyses   (13.01.2010 в 16:49)   письмо автору
 
   для: 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 и получить результат.

:( может я не понятно поясняю что именно мне нужно?

  Ответить  
 
 автор: Trianon   (13.01.2010 в 16:58)   письмо автору
 
   для: 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 и получаете список исключений.

>:( может я не понятно поясняю что именно мне нужно?

Простите, кто кому поясняет?

  Ответить  
 
 автор: Keyses   (13.01.2010 в 20:59)   письмо автору
 
   для: Trianon   (13.01.2010 в 16:58)
 

Я поясняю что мне нужно, вы поясняете как это правильно реализовать :)

Разобрался. Помогло RIGHT JOIN

  Ответить  
 
 автор: Trianon   (13.01.2010 в 23:42)   письмо автору
 
   для: 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

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования