MySQL:如果列等于这个或那个,则对行进行分组

标签 mysql group-by count

我有一个类似这样的简单表格。

Restaurant      Category
-------------------------
Restaurant1     American
Restaurant1     French
Restaurant2     American
Restaurant2     French

查看该表,我可以看到 Restaurant1 有美式和法式类别。我还可以看到Restaurant2有美式和法式类别。看到这个,我可以说有 2 个帖子同时具有美国和法国类别。

是否可以将其翻译成MySQL?因此,查询必须类似于“如果类别 = 美国且类别 = 法国,则按餐厅获取计数(餐厅)组”。我知道这对 MySQL 没有任何意义,但我似乎不知道如何做到这一点。

我注意到,如果美国和法国的帖子相同,那么我可以轻松地按餐厅对其进行分组,但我不确定 MySQL 中是否有办法做到这一点。

对于一个现实世界的例子,我试图计算 WordPress 中有多少帖子同时具有 ID 为 22 的类别和 ID 为 25 的类别。下面的查询应返回 3。这就是多少那里的帖子同时具有 22 和 25 类别。

SELECT COUNT(tr.object_id) AS post_count 
FROM wp_term_relationships AS tr
WHERE tr.term_taxonomy_id=25 AND tr.term_taxonomy_id=22

有人遇到过这个问题吗?

最佳答案

您可以使用这样的查询。它使用一个派生表,该表汇总了每家餐厅有多少个与美国法国匹配的不同类别。然后,它将具有 2 个匹配类别的餐厅数量相加,即它们都是美国法国

SELECT COUNT(Restaurant)
FROM (SELECT Restaurant, COUNT(DISTINCT Category) AS Am_or_Fr
      FROM restaurants
      WHERE Category IN ('American', 'French')
      GROUP BY Restaurant) r
WHERE Am_or_Fr = 2

输出(用于您的示例数据)

2

demo on SQLFiddle

更新

对于您添加到帖子中的查询,您需要将其重写为:

SELECT COUNT(t.object_id) AS post_count 
FROM (SELECT tr.object_id, COUNT(DISTINCT tr.term_taxonomy_id) AS term_count
      FROM wp_term_relationships AS tr
      WHERE tr.term_taxonomy_id IN (22, 25)
      GROUP BY tr.object_id) t
WHERE term_count = 2

关于MySQL:如果列等于这个或那个,则对行进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53716825/

相关文章:

powershell - 使用每行的第一个单词作为变量

sql - PostgreSQL 中的 GROUP BY 和 COUNT

php - 关于高效分页教程的建议?

MySQL,一次查询更新多个表

mysql - 以计算值为条件的 SQL

sql - 如何从组中获取第一个非零行?

MySQL按月获取行数和分组到列标题

sql - 如何在 SQL Server 中的 select 语句中将表名作为参数传递

MYSQL InnoDB 唯一键不能正常工作?

mysql - 用于创 build 置的 dll 文件