Как сделать пересечение двух выборок на MySQL ?

программирование php MySQL базы данных sql

Нужен аналог UNION, только нужно не объединение, а пересечение, т.е. выбрать только те ID, которые повторяются во всех множествах выборок.

select id from ....
????
select id from ....
????
select id from ....

что вместо ????
Просто лень искать, может кто-то знает ?

Примечание:
Использовал inner join. Я понимаю, что не лучший вариант, но пока что работает as well. Возможно, в будущем буду ещё оптимизировать.

Всем спасибо.
Ответы:
union, join...
Если так попробовать?
SELECT A.id FROM A WHERE EXISTS (SELECT * FROM B WHERE B.id=A.id) AND EXISTS (SELECT * FROM C WHERE C.id=A.id);
INNER JOIN. Если записей сильно много, то иной раз лучше выбрать n раз, а потом на стороне php работать с массивами, а не гонять сумасшедшие JOIN'ы.
select unique id from (
   select id from T                
    minus
  select unique id from T      
)
Делаеш inner join всех трех таблиц по полю id, результат будут строки ID которых есть во всех трех таблицах
Я бы взял все в массивы и обработал бы их функцией array_intersect
Странный для тебя вопрос. Чем тебе inner join не угодил? Но если приспичило выбрать строки именно последовательно, а не параллельно, как это будет в случае SELECT t1.*, t2.* FROM .. INNER JOIN ..., придется сделать два запроса.
$list=Db::sql('SELECT group_concat(t1.id separator ',') from t1 inner join t2 on t1.id=t2.id ...')->getOneField();
foreach(Db::sql("SELECT * from t1 WHERE id in ($list) UNION SELECT * from t2 WHERE id in ($list) ...")->query() as $row) { ... }


13 лет назад

RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.

Все вопросы, добавленные на сайт ответов Google, мы скопировали и сохранили здесь. Имена старых пользователей также отображены в том виде, в котором они существовали ранее. Только нужно заново пройти регистрацию, чтобы иметь возможность задавать вопросы, или отвечать другим.

Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.