【问题标题】:SQL: how to select a single id that meets multiple criteria from multiple rowsSQL:如何从多行中选择满足多个条件的单个id
【发布时间】:2013-08-01 05:33:40
【问题描述】:

在 MySQL 数据库中,我有下表

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 可以是11 AND 22(在这种情况下,它应该只选择package_id 99

我真的不知道这在 SQL 中是否可行,因为语句 AND 总是会导致错误。如果我使用声明 OR 我也会得到 package_id 99, 101, 120, 135 这不是我想要的。

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

编辑

我添加了content_quality 列

我用了juergen的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_number 是11 和 22 和 content_number 11有content_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

【问题讨论】:

    标签: mysql sql search select criteria


    【解决方案1】:

    您需要按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
    

    【讨论】:

    • 哇!它工作正常!太感谢了。我使用了您的第二个查询,请问 (distinct content_number) = 2 是什么意思?如果我搜索 3 号怎么办?然后我应该使用 (distinct content_number) = 3 吗?
    • 是的,如果您搜索 3 个号码,您需要 3。首先,我使用 where 子句过滤数据。只剩下content_numbers 11 和22。然后我用count(distinct content_number)来统计剩余content_numbers的个数。 distinct 用于确保不仅有两次22,还有11 和22。
    • 谢谢。我更新了我的问题,我现在如何在您的查询中添加新条件?另一个 where 子句和第二个有 count ?
    • 我更新了我的答案。如果您愿意,可以从 where 子句中删除括号。我添加了它们以提高可读性。
    • 谢谢!如您所见,我用最终查询更新了我的问题。必须对其进行更多测试,因为我在现实中使用了大约 8 个标准。不过看起来不错。如果您看到奇怪的东西,请不要犹豫:p 感谢您的宝贵时间!
    【解决方案2】:

    您可以使用自联接进行查询:

    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。所以你可以问,a是否有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
    

    【讨论】:

      猜你喜欢
      • 2011-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多