【问题标题】:A mysql query: couple of conditions matching in the same column一个 mysql 查询:在同一列中匹配的几个条件
【发布时间】:2011-11-06 17:45:35
【问题描述】:

我的 mysql 数据库中有这个名为“events”的表:

+-----+-----------+------------------------------+------------+
| ID  | CATEGORY  | NAME                         | TYPE       |
+-----+-----------+------------------------------+------------+
| 1   | 1         | Concert                      | music      |
| 2   | 2         | Basketball match             | indoors    |
| 3   | 1         | Theather play                | outdoors   |
| 4   | 1         | Concert                      | outdoors   |
+-----+-----------+------------------------------+------------+

我需要一个查询来计算类别 1 的事件以及哪种类型是音乐和户外 这意味着从上面的表格中计数应该只有 1:类别 1 的事件有 3 个 但只有“音乐会”有户外和音乐类型(ID 1 和 ID 4)。

那个查询是什么?可以吗?

【问题讨论】:

  • @Mat 你确定你对这个问题给予了足够的关注吗?对我来说它看起来并不基本。
  • 我有一个适用于我认为你想要的东西,但由于某种原因我不能发布它......
  • SELECT ID, COUNT(CATEGORY) FROM events WHERE CATEGORY=1 AND TYPE='music' AND TYPE='outdoors' GROUP BY ID

标签: mysql select count conditional-statements


【解决方案1】:

试试这个:

SELECT count(DISTINCT e1.name)
FROM `events` AS e1
JOIN `events` AS e2 ON e1.name = e2.name
WHERE e1.category = 1 
    AND e2.category = 1 
    AND e1.type = 'music' 
    AND e2.type = 'outdoor'

或者一种更难理解的方式,但比前一种方式更快:

SELECT count(*) FROM (
    SELECT `name`
    FROM `events`
    WHERE `category` = 1
    GROUP BY `name`
    HAVING SUM( `type` = 'music') * SUM( `type` = 'outdoor' ) >= 1
) AS notNeeded

【讨论】:

  • 第二个查询和第一个不一样。第一个正确,第二个错误。
  • 我不同意这表明结构不好。 Relational Division 经常出现在规范化数据库中。你会如何重组它?
  • @Johan 除了缺少别名之外还有什么不正确的?我还添加了别名。
  • @Alin,第二个查询也将产生具有 3x music 类型且没有 outdoor 的行
  • @Johan 你是对的。我假设 musictype 组合是独一无二的。我纠正了它。还根据相同的观察对第一个进行了修正。谢谢!
【解决方案2】:

对于 2 个标准,我会使用 Alin 的答案。下面是一种可用于更多数字的方法。

SELECT COUNT(*)
FROM   (SELECT `name`
        FROM   `events`
        WHERE  `category` = 1
               AND `type` IN ( 'outdoors', 'music' )
        GROUP  BY `name`
        HAVING COUNT(DISTINCT `type`) = 2) t  

【讨论】:

  • 是的...我写了第一种方法是因为它更容易理解,但即使是 2 个值也是一个糟糕的选择。
【解决方案3】:

试试这个查询

Select count(*), group_concat(TYPE SEPARATOR ',') as types 
from events where category = 1 
HAVING LOCATE('music', types) and  LOCATE('outdoors', types) 

【讨论】:

    【解决方案4】:

    尝试:

    SELECT * FROM `events` AS e1
    LEFT JOIN `events` AS e2 USING (`name`)
    WHERE e1.`category` = 1 AND e2.`category` = 1 AND e1.`type` = 'music' AND e2.`type` = 'outdoors'
    

    【讨论】:

      【解决方案5】:
      SELECT COUNT(*)
          FROM table
          WHERE category=1
          AND type='music' AND type IN (SELECT type
                                        FROM table
                                        WHERE type = 'outdoor')
      

      一条线路一直在重置我的连接。有什么?我会尝试发表评论

      【讨论】:

      • 有人知道为什么我不能在连接被拒绝的情况下输入吗?
      【解决方案6】:

      从 Category = '1' 和 Type in('music','outdoor') 的事件中选择 count(distinct ID) 作为 'eventcount'

      【讨论】:

      • count(*) 更快,无论如何您需要自加入,请参阅 Alin 的答案。
      • @Martin、stackoverflow.com/questions/2710621/… 以及几乎每个 SQL 博客上的无数链接
      • @Martin,但我想我应该写count(*) is never slower, sometimes the same and sometimes faster
      • @Johan - 同意 id 听起来很像 PK,所以在 SQL Server 中绝对不会出错。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多