我有以下表结构:
表文件夹
id | title | is_hidden
表对象
id | name | is_hidden | folder_id
表标签
id | name
表 label_to_folder
id | label_id | folder_id
label_to_folder
表定义)我试图获得最常用(流行)的标签,然后通过以下查询实现它(我认为:P):
SELECT COUNT(lf.label_id) AS cnt, lf.label_id, l.name FROM label_to_folder lf JOIN label l ON lf.label_id=l.id GROUP BY lf.label_id ORDER BY cnt DESC limit 8
我遇到的问题是上述查询的范围,因此它不计算隐藏文件夹(folder.is_hidden = 1)或空文件夹(空文件夹是根本没有任何对象的文件夹或所有文件夹& #39; s对象被隐藏了)
任何帮助表示感谢。
编辑
sqlfiddle:http://sqlfiddle.com/#!9/65526/1 结果包括id为5的文件夹,但其所有文件夹都是空的 - 这就是我想要消除的内容。
答案 0 :(得分:1)
你得到二手文件夹:
select f.id
from folder f
where f.is_hidden = 0
and exists
(
select *
from object o
where o.folder_id = f.id
and o.is_hidden = 0
)
然后您可以将其添加到您的查询中:
where lf.folder_id in (<above subquery>)
答案 1 :(得分:1)
假设以下产生了所需的中间结果,则后续查询提供相同的计数...
SELECT l.id label_id
, l.name label_name
, f.id folder_id
, f.title folder_title
, f.is_hidden folder_is_hidden
, o.id object_id
, o.name object_name
, o.is_hidden object_is_hidden
FROM label l
JOIN label_to_folder lf
ON lf.label_id = l.id
JOIN folder f
ON f.id = lf.folder_id
JOIN object o
ON o.folder_id = f.id
WHERE f.is_hidden = 0
AND o.is_hidden = 0
ORDER
BY label_id;
+----------+------------+-----------+--------------+------------------+-----------+-------------+------------------+
| label_id | label_name | folder_id | folder_title | folder_is_hidden | object_id | object_name | object_is_hidden |
+----------+------------+-----------+--------------+------------------+-----------+-------------+------------------+
| 4 | l3 | 4 | Folder 3 | 0 | 6 | object F | 0 |
| 4 | l3 | 6 | Folder 5 | 0 | 7 | object G | 0 |
| 4 | l3 | 10 | Folder 9 | 0 | 10 | object J | 0 |
| 4 | l3 | 6 | Folder 5 | 0 | 9 | object I | 0 |
| 4 | l3 | 11 | Folder 10 | 0 | 11 | object K | 0 |
| 4 | l3 | 4 | Folder 3 | 0 | 1 | object A | 0 |
| 4 | l3 | 4 | Folder 3 | 0 | 2 | object B | 0 |
| 4 | l3 | 4 | Folder 3 | 0 | 3 | object C | 0 |
| 4 | l3 | 6 | Folder 5 | 0 | 8 | object H | 0 |
| 4 | l3 | 4 | Folder 3 | 0 | 4 | object D | 0 |
| 4 | l3 | 4 | Folder 3 | 0 | 5 | object E | 0 |
| 6 | l5 | 6 | Folder 5 | 0 | 8 | object H | 0 |
| 6 | l5 | 4 | Folder 3 | 0 | 1 | object A | 0 |
| 6 | l5 | 4 | Folder 3 | 0 | 2 | object B | 0 |
| 6 | l5 | 6 | Folder 5 | 0 | 7 | object G | 0 |
| 6 | l5 | 4 | Folder 3 | 0 | 3 | object C | 0 |
| 6 | l5 | 4 | Folder 3 | 0 | 4 | object D | 0 |
| 6 | l5 | 4 | Folder 3 | 0 | 5 | object E | 0 |
| 6 | l5 | 4 | Folder 3 | 0 | 6 | object F | 0 |
| 6 | l5 | 6 | Folder 5 | 0 | 9 | object I | 0 |
| 9 | l8 | 4 | Folder 3 | 0 | 2 | object B | 0 |
| 9 | l8 | 4 | Folder 3 | 0 | 3 | object C | 0 |
| 9 | l8 | 4 | Folder 3 | 0 | 4 | object D | 0 |
| 9 | l8 | 4 | Folder 3 | 0 | 5 | object E | 0 |
| 9 | l8 | 4 | Folder 3 | 0 | 6 | object F | 0 |
| 9 | l8 | 4 | Folder 3 | 0 | 1 | object A | 0 |
+----------+------------+-----------+--------------+------------------+-----------+-------------+------------------+
SELECT l.id label_id
, l.name label_name
, COUNT(*) total
FROM label l
JOIN label_to_folder lf
ON lf.label_id = l.id
JOIN folder f
ON f.id = lf.folder_id
JOIN object o
ON o.folder_id = f.id
WHERE f.is_hidden = 0
AND o.is_hidden = 0
GROUP
BY l.id
ORDER
BY total DESC
LIMIT 3;
+----------+------------+-------+
| label_id | label_name | total |
+----------+------------+-------+
| 4 | l3 | 11 |
| 6 | l5 | 9 |
| 9 | l8 | 6 |
+----------+------------+-------+
答案 2 :(得分:0)
您是否尝试过以下查询?
SELECT COUNT(lf.label_id) AS cnt
, lf.label_id
, l.name
FROM label_to_folder lf
JOIN label l
ON lf.label_id = l.id
JOIN object o
ON o.folder_id = l.folder_id
JOIN folder f
ON f.id = l.folder_id
WHERE f.is_hidden = 1
AND o.is_hidden = 1
GROUP
BY lf.label_id
ORDER
BY cnt DESC
LIMIT 8