代码之家  ›  专栏  ›  技术社区  ›  Jamie Rumbelow

其他表的计数所在的SQL

  •  0
  • Jamie Rumbelow  · 技术社区  · 16 年前

    所以,我想对count()as子句分配的字段应用一个where条件。我的查询当前如下:

    SELECT new_tags.tag_id
           , new_tags.tag_name
           , new_tags.tag_description
           , COUNT(DISTINCT new_tags_entries.entry_id) AS entry_count 
    FROM (new_tags) 
    JOIN new_tags_entries ON new_tags_entries.tag_id = new_tags.tag_id 
    WHERE `new_tags`.`tag_name` LIKE '%w' 
    AND `entry_count` < '1' 
    GROUP BY new_tags.tag_id ORDER BY tag_name ASC
    

    失败的位是WHERE子句中的条目_count—它不知道条目_count列是什么。我的桌子看起来像这样:

    new_tags {
        tag_id INT
        tag_name VARCHAR
    }
    
    new_tags_entries {
        tag_id INT
        entry_id INT
    }
    

    我想根据与标签ID相关的新标签条目中不同条目ID的数量筛选结果。

    有道理?

    事先谢谢。

    4 回复  |  直到 16 年前
        1
  •  2
  •   APC    16 年前

    要筛选聚合值,请使用 HAVING 条款。。。

    SELECT  
       new_tags.tag_id, new_tags.tag_name,  
       new_tags.tag_description,  
       COUNT(DISTINCT new_tags_entries.entry_id) AS entry_count  
    FROM (new_tags)  
    JOIN new_tags_entries ON new_tags_entries.tag_id = new_tags.tag_id   
    WHERE `new_tags`.`tag_name` LIKE '%w'   
    GROUP BY new_tags.tag_id  
    HAVING COUNT(DISTINCT new_tags_entries.entry_id)  < '1' 
    ORDER BY tag_name ASC
    
        2
  •  1
  •   Ignacio Vazquez-Abrams    16 年前

    内部联接的计数永远不会小于1。可能是左联和 IS NULL 会有帮助的。使用或使用 SUM() 相反。

        3
  •  1
  •   Roland Bouman    16 年前

    虽然apc的答案在语法上是正确的,但是如果您试图解决的问题确实是:“查找所有没有任何新闻标签条目的新标签”,那么查询 INNER JOIN GROUP BY HAVING 不会产生正确的结果。实际上,它总是会产生空的集合。

    正如伊格纳西奥·瓦兹奎斯·阿布拉罕斯指出的那样, LEFT JOIN 会工作。你甚至不需要 分组依据 / :

    SELECT    news_tags.*
    FROM      news_tags
    LEFT JOIN news_tags_entries 
    ON        news_tags.tag_id = news_tags_entries.tag_id
    WHERE     news_tags_entries.tag_id IS NULL
    

    (当然,你仍然可以添加 小组通过 如果你想知道有多少条目,而不仅仅是想找到 news_tags 零度 news_tags_entries . 但是 左连接 从“新闻标记”到“新闻标记”条目都需要存在,否则您将丢失“新闻标记”中没有相应项目的“新闻标记”)。

    另一个更明确的解决方法是“得到所有x,其中没有y”是相关的。 NOT EXISTS 解决方案:

    SELECT    news_tags.*
    FROM      news_tags
    WHERE NOT EXISTS (
              SELECT NULL
              FROM   news_tags_entries
              WHERE  news_tags_entries.tag_id = news_tags.tag_id
              )
    

    虽然很好也很明确,但由于子查询性能相当差,在MySQL中通常不使用此解决方案。

        4
  •  0
  •   Hyque    16 年前
    SELECT 
       new_tags.tag_id, new_tags.tag_name, 
       new_tags.tag_description, 
       COUNT(DISTINCT new_tags_entries.entry_id) AS entry_count 
    FROM (new_tags) 
    LEFT JOIN new_tags_entries ON new_tags_entries.tag_id = new_tags.tag_id  
    WHERE `new_tags`.`tag_name` LIKE '%w'  
    GROUP BY new_tags.tag_id ORDER BY tag_name ASC
    HAVING `entry_count` < '1'