【问题标题】:MySQL : Make HAVING select also "null"MySQL:使 HAVING 也选择“null”
【发布时间】:2012-12-08 09:19:08
【问题描述】:

我有两张桌子:dilemmelike。第一个包含文章,第二个包含投票。脚本随机选择一篇文章显示,用户可以投票(喜欢和不喜欢)。

我想查询只显示投票数超过 - 5 的文章,没有投票的文章等于 0。

所以我尝试了这个:

SELECT d.ph1, d.ph2, d.id, SUM(l.vote) AS score
FROM dilemme d
LEFT JOIN like l
ON d.id = l.id_dilemma
WHERE d.valid = 'yup'
GROUP BY d.id HAVING SUM(l.vote) > 0

它正确地向我显示了至少有一个投票并且投票总和大于 0 的行。这很好但是,如何选择没有投票的文章?

我尝试了很多方法并进行了一些研究,但无法解决我的问题。 我认为 INSERT INTO 就像投了 0 票,但我认为这不是一个好主意,因为它不会是一个非常优化的解决方案。

【问题讨论】:

    标签: mysql select group-by having


    【解决方案1】:

    这应该包括有赞成票的文章,或者使用COUNT(l.id_delemma) = 0 包括没有投票的文章

    SELECT d.ph1, d.ph2, d.id, SUM(l.vote) AS score
    FROM dilemme d
    LEFT JOIN like l
    ON d.id = l.id_dilemma
    WHERE d.valid = 'yup'
    GROUP BY d.id 
    HAVING 
        SUM(l.vote) > 0
        OR COUNT(l.id_delemma) = 0
    

    【讨论】:

    • @RachidZuco 不客气……这很有趣!我认为我第一次在HAVING 子句中使用了OR
    【解决方案2】:

    selecthaving 子句中使用 ifnull 函数:

    ...having(ifnull(l.vote,0)) > 0...
    

    【讨论】:

      【解决方案3】:
      SELECT d.ph1, d.ph2, d.id, SUM(IFNULL(l.vote, 0)) AS score
      FROM dilemme d
      LEFT JOIN like l
      ON d.id = l.id_dilemma
      WHERE d.valid = 'yup'
      GROUP BY d.id
      HAVING score > 0
      

      但我不确定您希望它如何工作。如果一个项目没有投票,它的分数怎么会大于0?

      【讨论】:

      • 感谢您的回答。这个想法很好。但是,此查询不会给出预期的结果。正如 Alex Monthy 提到的那样,他的回答是 ifnull 必须放在 having 子句中。
      猜你喜欢
      • 1970-01-01
      • 2015-03-09
      • 1970-01-01
      • 2011-12-16
      • 2012-05-31
      • 2017-11-30
      • 2022-08-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多