我有以下表结构:
item_id | value | ================== 1 | 1 | 1 | 3 | 1 | 4 | 2 | 2 | 2 | 3 | 2 | 4 | 2 | 5 | 3 | 1 | 3 | 5 | 3 | 6 | 4 | 1 | 4 | 3 | 4 | 4 | 4 | 5 |
我有一个查询返回那些值与1,3和4匹配的item_id。 所以这里应该返回的item_ids是1和4。
我的查询:
select item_id from table t where exists (select item_id from table t1 where value = 1 and t1.item_id = t.item_id) and exists (select item_id from table t1 where value = 2 and t1.item_id = t.item_id) group by item_id
此查询工作正常。在这里,我只匹配3个值。如果我想从表中匹配50个这样的值怎么办? (所有50个值都存储在php数组中)查询将是巨大的,我也希望在同一查询中的两个不同的表中执行相同的操作。因此,这将使已经很大的查询的大小翻倍。请给我一些其他方法。
编辑::
table 2 -------- item_id | user_id | ================== 1 | 1 | 1 | 5 | 1 | 7 | 2 | 2 | 2 | 3 | 2 | 4 | 2 | 5 | 3 | 1 | 3 | 5 | 3 | 6 | 4 | 1 | 4 | 3 | 4 | 4 | 4 | 5 |
现在,我想要item_id,其中table1的值为1,3,4,table2的user_id为1,5,7
答案 0 :(得分:4)
此问题称为Relational Division
。
SELECT item_ID
FROM tableName
WHERE value IN (1,3,4)
GROUP BY item_ID
HAVING COUNT(*) = 3
如果对value
列的item_id
列没有强制执行唯一性,则DISTINCT
只需计算唯一值,
SELECT item_ID
FROM tableName
WHERE value IN (1,3,4)
GROUP BY item_ID
HAVING COUNT(DISTINCT value) = 3