2013-07-31 80 views
1

在一个MySQL数据库中的单个ID,下面我有SQL:如何选择满足多个条件多行

package_content : 

id | package_id | content_number | content_name | content_quality 

1  99   11    Yellow   1 
2  99   22    Red    5 
3  101   11    Yellow   5 
4  101   33    Green   5 
5  101   44    Black   5 
6  120   11    Yellow   5 
7  120   55    White   5 
8  135   66    Pink    5 
9  135   99    Orange   5 
10  135   11    Yellow   5 

表,我期待有可能使上搜索查询:

我想选择package_id其中content_number可能是1122(在这种情况下,它应该只选择package_id 99

我真的不知道它是否可能在SQL中,因为语句AND将始终导致为false。如果我使用声明OR我也得到package_id 99, 101, 120, 135,这不是我想要的。

也许我的桌子设计得不好,但任何建议都会有帮助!提前 感谢

编辑

我加入了content_quality

我使用的SQL查询从克林斯曼,工作得非常好

select package_id 
from package_content 
where content_number in (11,22) 
group by package_id 
having count(distinct content_number) = 2 

我的最后一个问题是我怎么能现在添加另一个标准:选择package_id其中content_number11a第二22content_number 11content_quality 1

编辑2:

对于第二个问题我现在这个查询使用。感谢你们帮助我的两位! :)

SELECT * 
FROM (
    SELECT package_id 
    FROM package_content 
    WHERE 
     (content_number=11 AND content_quality > 1) 
     OR (content_number = 33 AND content_quality = 5) 
     OR (content_number = 44 AND content_quality =5 AND content_name like 'Black') 
    GROUP BY package_id 
    HAVING count(DISTINCT content_number) = 3 
    )t1 
LEFT JOIN package_content ON package_content.package_id = t1.package_id 

这将输出

id | package_id | content_number | content_name | content_quality 

3  101   11    Yellow   5 
4  101   33    Green   5 
5  101   44    Black   5 

回答

2

您需要组由package_id然后用having超过分组数据

select package_id 
from package_content 
where content_number = 22 
or 
(
    content_number = 11 and content_quality = 1 
) 
group by package_id 
having count(distinct content_number) = 2 
+0

哇!它工作正常! Thx这么多。我用你的第二个查询,我可以问什么(distinct content_number)= 2的含义?如果我搜索3号码怎么办?我应该使用(distinct content_number)= 3吗? – yves

+0

是的,如果你搜索3个数字,你需要'3'。首先我用那里的where子句过滤数据。只剩下'content_number's'11'和'22'。然后我使用count(distinct content_number)来计算剩下的content_number的数量。'distinct'用于确保不仅有2次'22',而是'11'和'22'。 –

+0

谢谢。我更新了我的问题,我现在如何在查询中添加新的标准?用另一个where子句和第二个计数? – yves

1

您可以用查询执行聚合功能一个自我加入:

SELECT DISTINCT package_id 
FROM package_content a, package_content b 
WHERE a.package_id = b.package_id 
     AND a.content_number = 11 AND b.content_number = 22 

编辑:对于第二个问题:只需将其添加到查询。更名为a的package_content负责content_number 11.因此你可以问,阉一个具有content_quality 1:

SELECT DISTINCT package_id 
FROM package_content a, package_content b 
WHERE a.package_id = b.package_id 
     AND a.content_number = 11 AND b.content_number = 22 
     AND a.content_quality = 1 
+0

谢谢,工作得很好! – yves

相关问题