2

我有以下表结构:

item_id | 价值 |  
===================  
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_id 是 1 和 4。

我的查询:

从表 t 中选择 item_id
where exists (select item_id from table t1 where value = 1 and t1.item_id = t.item_id)
并且存在(从表 t1 中选择 item_id,其中 value = 2 和 t1.item_id = t.item_id)按 item_id 分组

此查询工作正常。这里我只匹配 3 个值。如果我想从表中匹配 50 个这样的值怎么办?(所有 50 个值都存储在一个 php 数组中)查询会很大,而且我想在同一个查询中从两个不同的表中做同样的事情。因此,这将使已经很庞大的查询的大小翻倍。请给我一些其他的建议。

编辑::

表 2
--------

item_id | 用户 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

4

1 回答 1

7

这个问题叫做Relational Division.

SELECT  item_ID
FROM    tableName
WHERE   value IN (1,3,4)
GROUP   BY item_ID
HAVING  COUNT(*) = 3

如果没有value对每个列强制执行唯一性item_idDISTINCT则需要仅计算唯一值,

SELECT  item_ID
FROM    tableName
WHERE   value IN (1,3,4)
GROUP   BY item_ID
HAVING  COUNT(DISTINCT value) = 3
于 2013-05-14T06:24:45.587 回答