совпадающие значение id2 и type где id1 равен X или Y

BeliyFenix

Новичок
совпадающие значение id2 и type где id1 равен X или Y

Есть гипотетическая таблица вида:

id1 | id2 | type

Необходимо выбрать совпадающие значение id2 и type где id1 равен X или Y.
Получается что нужно найти все id2 и type где id1 равен тому или другому, а далее оставить только дублирующиеся значения, но какую конструкцию применить никак не могу допетрить. GROUP BY, DISTINCT тут не подходят. Критически важно чтобы конструкция работала максимально быстро.
 

zerkms

TDD infected
Команда форума
Напиши для начала запрос, который выбирает по заданному условию но с дублированием, и покажи сюда
 

BeliyFenix

Новичок
Вчера всетаки осилил решение которое справляется с поставленной задачей.
Таблица собственно на самом деле такая:
stat_id | obj | obj_id
По сути надо найти пересечение одинаковых пар значение obj_id и obj по stat_id.

Вот запрос который почти решил задачу для поиска пересечения по трем значениям:
Код:
SELECT * FROM `search_result_cache` 
		WHERE obj_id = ANY 
			(SELECT obj_id FROM `search_result_cache` 
				WHERE obj_id = ANY 
					(SELECT obj_id FROM `search_result_cache` WHERE stat_id=3) 
				AND stat_id=2) 
			AND stat_id=1
1. Вот чует мое сердце что можно все это сделать куда более простой конструкцией.
2. Как теперь модернизировать данный запрос чтобы группировка шла либо может по составному индексу obj И obj_id, либо просто по паре полей.
 

zerkms

TDD infected
Команда форума
жесть

может лучше тогда:

WHERE `stat_id` IN (1, 2, 3)
GROUP BY `obj_id`
HAVING COUNT(*) = 3

?
 

x-yuri

Новичок
zerkms это если ни одной паре (obj_id, obj) не могут соответствовать 2 или больше записей с одинаковым stat_id

p.s. ты забыл obj в GROUP BY

-~{}~ 21.02.09 14:01:

есть такая идея:
GROUP BY obj_id, obj, stat_id
HAVING ( stat_id IN (1, 2, 3) ) && COUNT(*) = 3
 

zerkms

TDD infected
Команда форума
x-yuri
предложенный тобой вариант также не учтёт наличие 2х одинаковых записей.
и зачем вообще obj, stat_id в группировке?

его запрос, насколько я понимаю, соответствует моему, с той лишь разницей, что мой не учтёт одинаковые записи, а твой непонятно что сгруппирует.

м?
 

BeliyFenix

Новичок
Group и Having не подходят по той причине что они тупо возвращают либо все найденные результаты либо пусто.

На самом деле описанная мной схема, это некий кэш указывающий конкретно что и откуда надо брать. Obj - привязка к объекту, obj_id - его идентификатор. В результате выборки нужно выбрать только те объекты которые включают в себя указанные stat_id.

Не знаю как еще понятнее объяснить, может просто не понятна суть задачи.
 

x-yuri

Новичок
предложенный тобой вариант также не учтёт наличие 2х одинаковых записей.
и зачем вообще obj, stat_id в группировке?
я попытался решить проблему одинаковых записей (поэтому stati_id) и ориентировался не только на запрос, но и на описание (поэтому obj). У меня не полуилось(

Group и Having не подходят по той причине что они тупо возвращают либо все найденные результаты либо пусто
значит надо разобраться почему. Может потому, что вариант zerkms не учитывает наличие одинаковых записей (см. выше)?
 

Gas

может по одной?
насколько я понял, то по мотивам приведённых вариантов, BeliyFenix'у подойдёт что-то типа:

Код:
SELECT s1.* FROM
(
  SELECT obj_id FROM `search_result_cache`
  WHERE `stat_id` IN (1, 2, 3)
  GROUP BY obj_id
  HAVING COUNT(DISTINCT obj_id) = 3
) AS t
JOIN `search_result_cache` AS s1 ON s1.obj_id=t.obj_id AND s1.stat_id IN (1,2,3)
 

Gas

может по одной?
zerkms
ага, stat_id и возможно при джойне будет лучше заменить s1.stat_id IN (1,2,3) на s1.stat_id=t.stat_id (во вложенном запросе возвращать и это поле).

но я тоже мог понять условие не правильно и как обычно, запрос не тестил :)
 
Сверху