Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MySQL > Подскажите как поиском отсутствующих данных


Автор: maxipub 16.7.2014, 11:18
Добрый день!

Есть таблица A с id, нужно выбрать данные из таблицы B, для которых нет id=val (но которые есть в A). Как делаем:

Код
SELECT ... FROM A LEFT JOIN B ON B.id=A.id WHERE A.id=val AND B.id IS NULL


Задача у нас чуть сложнее.

Есть таблицы TABLE_1, TABLE_2.1 и TABLE_2.2, нужно выбрать данные из TABLE_3, для которых нет записи id=val, существующей в TABLE_1 ИЛИ в TABLE_2.1 - но для последней только для случае, когда id=val ЕСТЬ и в TABLE_2.2

т.е. условие вида

ВЫБРАТЬ данные из таблицы TABLE_3 ПРИ УСЛОВИИ, что id=val есть в TABLE_1 ИЛИ в (TABLE_2.1 И TABLE_2.2), но нет в TABLE_3

Такое можно сделать одним запросом?

Пока склоняюсь к мысли разбить его на два запроса (отдельно TABLE_1, отдельно TABLE_2.1 И TABLE_2.2), и далее результаты уже объединить посредствам php. 

Заранее спасибо за помощь! smile 

Автор: Akina 17.7.2014, 11:56
Нужно что-то типа
Код

select *
from table3
where id in (   
    select val 
    from table1
  union all
    select table21.val 
    from table21, table22 
    where table21.val=table22.val
)

Цитата(maxipub @  16.7.2014,  12:18 Найти цитируемый пост)
склоняюсь к мысли разбить его на два запроса (отдельно TABLE_1, отдельно TABLE_2.1 И TABLE_2.2), и далее результаты уже объединить посредствам php. 

Незнание - не повод делать через задницу.

Автор: maxipub 18.7.2014, 08:31
Akina, спасибо, попробуем так.

Цитата(Akina @  17.7.2014,  11:56 Найти цитируемый пост)
Незнание - не повод делать через задницу. 

Ну так я и спрашиваю.

Автор: maxipub 18.7.2014, 08:51
Блин, сорри, я ерунду написал.

Все то же самое, только данные выбираются из TABLE_1 / TABLE_2.1, id которых нет в TABLE_3!

Пока сделал все же раздельными запросами, т.к. это логично и быстро. Не совсем пойму такой выпад в сторону это. Часто разделяют большие запросы на 2-3-4 даже. Тем более решение с IN при неизвестном количестве данных - очень спорный вариант, ИМХО.

Автор: Akina 18.7.2014, 10:09
Цитата(maxipub @  18.7.2014,  09:51 Найти цитируемый пост)
Все то же самое, только данные выбираются из TABLE_1 / TABLE_2.1, id которых нет в TABLE_3!

Не понял фразы.

Цитата(maxipub @  18.7.2014,  09:51 Найти цитируемый пост)
Часто разделяют большие запросы на 2-3-4 даже. 

В 90% случаев так делают те, кто ни ухо ни рыло в запросах. Сделать фигню, а потом придумать, почему так лучше, да ещё гордиться этим... не иди таким путём.
Да, бывают ситуации, когда так на самом деле правильно. Но они редки, и это почти наверняка не твой случай.

Цитата(maxipub @  18.7.2014,  09:51 Найти цитируемый пост)
логично и быстро. Не совсем пойму такой выпад в сторону это

Ну тогда сделай следующий логический шаг, и вообще откажись от сервера БД...

Автор: maxipub 18.7.2014, 12:04
Цитата(Akina @  18.7.2014,  10:09 Найти цитируемый пост)
Не понял фразы.

Я писал:

Цитата(maxipub @  16.7.2014,  11:18 Найти цитируемый пост)
Есть таблицы TABLE_1, TABLE_2.1 и TABLE_2.2, нужно выбрать данные из TABLE_3, для которых нет записи id=val, существующей в TABLE_1 ИЛИ в TABLE_2.1 - но для последней только для случае, когда id=val ЕСТЬ и в TABLE_2.2


А на самом деле надо так:

Есть таблицы TABLE_1, TABLE_2.1 и TABLE_2.2, TABLE_3. Нужно выбрать данные из TABLE_1, TABLE_2.1 (сами данные могут пересекатся, выборка должна быть с группировкой по id, дубли не нужны), у выбираемых данных должен быть id, которого нет в TABLE_3. При этом, из TABLE_2.1 берем только те записи, для которых id есть и в TABLE_2.2.

Автор: Akina 21.7.2014, 14:00
Цитата(maxipub @  18.7.2014,  13:04 Найти цитируемый пост)
на самом деле надо так:

Я лично ничего не понимаю в твоём описании...

Автор: maxipub 22.7.2014, 17:07
Выбрать записи, id которых нет в TABLE_3, но есть в TABLE_1 и/или в ( TABLE_2.1 и TABLE_2.2 ).

Автор: Akina 22.7.2014, 19:49
Ааа... вот так, что ли?

Код

select q.val
from 
(   
    select val 
    from table1
  union 
    select table21.val 
    from table21, table22 
    where table21.val=table22.val
) q
left join table3 on q.val=table3.id
where table3.id is null

Автор: maxipub 24.7.2014, 10:44
Akina, спасибо всен оказалось не так сложно, вы были правы. smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)