mysql计数并加入4个表

时间:2015-11-27 13:47:27

标签: mysql join count

我有以下表结构:

文件夹
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的文件夹,但其所有文件夹都是空的 - 这就是我想要消除的内容。

3 个答案:

答案 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
相关问题