2013-04-24 3 views
2

Im пытается выбрать только объекты, которые находятся во всех трех группах (1,2,3).
С помощью «WHERE gid IN (1,2,3)« Выберите, у меня есть выбор OR. Мне нужен выбор AND.SELECT WHERE IN с логическим выражением AND

OBJECT_TABLE AS o 
id | field1 | field2 | ... 

VALUES 
1, a, b 
2, c, d 
3, e, f 
... 


GROUP_XREF_TABLE AS gx 
oid | gid 

VALUES 
1, 1 
1, 2 
1, 3 
2, 2 
3, 1 
3, 2 
... 


SELECT DISTINCT o.id, gx.gid FROM `OBJECT_TABLE` AS o 
LEFT JOIN `GROUP_XREF_TABLE` AS gx ON o.id = gx.oid 
WHERE gx.gid IN (1,2,3) 

Это выводит все строки. Мне нужно предложение WHERE, которое выводит только строки с идентификатором объекта 1, потому что только этот объект находится во всех трех группах.

Его часть более крупного выбора, поэтому важно, чтобы это было сделано только внутри оператора where (при необходимости подселекты должны быть точными).

ответ

3

подвыборки ниже будет найти те OID: S, которые имеют 3 строки в GX:

SELECT o.id, gx.gid FROM `OBJECT_TABLE` AS o 
LEFT JOIN `GROUP_XREF_TABLE` AS gx ON o.id = gx.oid 
WHERE gx.oid IN (
    SELECT oid FROM GROUP_XREF_TABLE as gx2 
    GROUP BY oid 
    HAVING count(*) = 3) 
+1

спасибо! это должно сработать, но я не получаю никаких результатов. Я думаю, что SELECT должен быть gid? – Mike

+0

@Mike Красиво заметили! Я обновил ответ. –

+0

Мне действительно пришлось расширять его, потому что ваш запрос доставил мне объекты, которые находятся в любых группах, если они три из них. Мне нужно указать группы. поэтому я сделал это: WHERE gx.oid IN (SELECT oid FROM GROUP_XREF_TABLE как gx2 ГДЕ ВИД (1,2,3) ГРУППА BY oid HAVING count (*) = 3) – Mike

0

попробовать это

SELECT o.id, gx.gid FROM `OBJECT_TABLE` AS o 
    LEFT JOIN `GROUP_XREF_TABLE` AS gx ON o.id = gx.oid 
    WHERE gx.gid IN (1,2,3) 
    group by gx.gid 

DEMO HERE

+0

надеюсь, что это поможет вам! –

+0

Я не уменьшил его, но этот ответ неверен - он дает правильный вывод, учитывая данные, но только по совпадению. Если вы добавите запись (3,3) в GROUP_XREF_TABLE, вы увидите строки для 1 и 3, но вы не видите - см. Http://sqlfiddle.com/#!2/90fdf/1. –

Смежные вопросы