MySQL 获取具有特定属性的项目,按包含的属性数量排序

标签 mysql count distinct multiple-tables

我有 3 个表: 食物-

id    name
1     pizza
2     pasta
3     salad

标签

id    tagName
1     spicy
2     non-spicy
3     healthy
4     cheesy

食物标签

id    food_id    tag_id
1     1          1
2     1          4
3     2          2
4     2          4
5     3          3
6     3          2

我想查询这三个表以获取按最大匹配标签数排序的食品。因此,如果我查询带有标签(“辣”、“奶酪”)的食物,我应该按该顺序获取披萨和意大利面,而不是沙拉(因为它不包含任何相关标签)。

我正在尝试这个查询,但它没有给我想要的结果:

SELECT a.name, COUNT(DISTINCT c.tagName) FROM food a, tags b, food_tag c
 WHERE b.tagName in ('spicy', 'cheesy') AND b.id = c.tag_id 
 AND a.id = c.food_id ORDER BY COUNT(DISTINCT c.tagName) DESC;

我想要的输出是:

a.name   count(distinct c.tagName)  
pizza    2
pasta    1

谁能告诉我我的错误是什么?

最佳答案

问题

  • missing group by a.name

调整后的查询

SELECT a.name, COUNT(DISTINCT b.tagName) 
FROM food a, tags b, food_tag c 
WHERE b.tagName in ('spicy', 'cheesy') 
AND b.id = c.tag_id 
AND a.id = c.food_id 
group by a.name
ORDER BY COUNT(DISTINCT b.tagName) DESC
;

输出

+-------+---------------------------+
| name  | COUNT(DISTINCT b.tagName) |
+-------+---------------------------+
| pizza |                         2 |
| pasta |                         1 |
+-------+---------------------------+

sqlfiddle

关于MySQL 获取具有特定属性的项目,按包含的属性数量排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33853450/

相关文章:

node.js - Node ,MongoDB( Mongoose )非重复计数

mysql - 克隆表,包括多个 pk

php - 在 Laravel 上手动登录到与默认连接不同的连接

mysql - 检查mysql某列的和是否为正

php - PDO PHP 中的日期格式

mysql - 从 mysql 表子查询中计算行号

python - 使用 django 在 mysql 数据库上使用 DISTINCT

r - 函数 (x,y),x 和 y 都变化

mysql - 使用 group by 子句和 count() 函数时 MySQL 的不一致/奇怪行为

sql - 将不同列的结果放入单个列中