Mysql根据同一个表中的多行选择行

时间:2013-05-14 06:23:38

标签: mysql sql

我有以下表结构:

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

1 个答案:

答案 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