【问题标题】:mysql count and join 4 tablesmysql计数并加入4个表
【发布时间】:2015-11-27 13:47:27
【问题描述】:

我的表结构如下:

表格文件夹
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) 或空文件夹(空文件夹是一个根本没有对象的文件夹,或者文件夹的所有对象都是隐藏)

任何帮助表示赞赏。

编辑

sqlfiddle: http://sqlfiddle.com/#!9/65526/1 那里的结果包括 id 为 5 的文件夹,但它的所有文件夹都是空的 - 这就是我要消除的。

【问题讨论】:

  • 您可以添加一些数据以便我重新创建它来测试它吗?
  • 只是一个观察 - label_to_folder 表中的id 似乎是多余的。除此之外,如果您愿意,请考虑遵循以下简单的两步操作: 1. 如果您还没有这样做,请提供适当的 CREATE 和 INSERT 语句(和/或 sqlfiddle),以便我们可以更轻松地复制问题. 2. 如果您尚未这样做,请提供与步骤 1 中提供的信息相对应的所需结果集。
  • @Strawberry 我正在研究 sql fiddle
  • 酷。那是二分之一。
  • 幸运的是,没有任何对象(或文件夹)被隐藏,所以这应该不是问题

标签: mysql join count


【解决方案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>)

【讨论】:

    【解决方案2】:

    假设以下产生所需的中间结果,那么后续查询提供相同的计数...

    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 |
    +----------+------------+-------+
    

    【讨论】:

    • 上述查询通过计算对象而不是文件夹来计算总数。例如 label_id 4 (l3) 应该总共有 4 个(文件夹 4、6、10 和 11),而不是 11 个(这是这 4 个文件夹的对象的计数)。这几乎是一个可以接受的解决方案——因此是赞成票。非常感谢您的尝试!
    • 你想只计算“没有隐藏对象”的文件夹还是只计算“至少有一个可见对象”的文件夹
    • 计数指的是文件夹的“使用”标签,而不是文件夹本身。无论如何,Thorsten Kettner 的回答似乎工作正常,所以没关系!再次感谢您的帮助!
    • 'albums' 在您的问题中被引用了几次。但是您的架构中没有专辑实体
    • 你完全正确!我的错误-文件夹和专辑在我的语言中似乎相同:s。很抱歉让您感到困惑!
    【解决方案3】:

    您是否尝试过以下查询?

    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
    

    【讨论】:

      猜你喜欢
      • 2011-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-03
      相关资源
      最近更新 更多