【问题标题】:Select something from mysql database and order it by count (where)从 mysql 数据库中选择一些东西并按计数排序(在哪里)
【发布时间】:2016-09-25 21:36:17
【问题描述】:

我在从数据库中选择某些内容时遇到问题。这是sql语句:

SELECT name 
FROM table1 
JOIN table2
ON table1.id=table2.advid 
GROUP BY advid 
ORDER BY COUNT(table2.likes) ASC

这将输出name,最小的table2.likes到最大的table2.likes

问题是table2.likes 包含喜欢和不喜欢。表中喜欢用 1 标记,不喜欢用 2 标记。

目前,如果有...

...写在表格中,语法将计算喜欢和不喜欢,因此结果为 6。我需要这个结果为零,这意味着在计数时,必须从喜欢的数量中推断出不喜欢.这也意味着句子的这一部分:ORDER BY COUNT(table2.likes) ASC 必须更改,但我不知道如何。

【问题讨论】:

    标签: mysql sql select count sql-order-by


    【解决方案1】:

    SUM()使用条件聚合:

    SELECT name 
    FROM table1 t1 JOIN
         table2 t2
         ON t2.id = t2.advid 
    GROUP BY name
    ORDER BY SUM(CASE WHEN t2.likes = 1 THEN 1 ELSE -1 END) ASC;
    

    注意:我将 GROUP BY 更改为 nameGROUP BY 列应与您选择的列匹配。

    【讨论】:

      【解决方案2】:

      使用 case 表达式将喜欢记为 1,将不喜欢记为 -1。不加入然后聚合,而是加入已经聚合的数据,这被认为是一种很好的风格并且不易出错。

      select t1.name, t2.sumlikes
      from table1 t1
      join
      (
        select advid, sum(case when likes = 1 then 1 else -1 end) as sumlikes
        from table2
        group by advid
      ) t2 on t2.advid = t1.id
      order by sumlikes;
      

      如果您也想列出不带类似条目的名称,请将联接转换为 left outer join 并改为选择 coalesce(t2.sumlikes, 0)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-01-31
        • 2015-02-01
        • 1970-01-01
        • 2011-08-09
        • 1970-01-01
        • 2021-01-15
        • 2023-03-08
        • 2019-02-04
        相关资源
        最近更新 更多