从mysql数据库中选择一些东西并按count(在哪里)进行排序

时间:2016-09-25 21:36:17

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

我在从数据库中选择内容时遇到问题。这是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。

目前,如果有......

The table

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

2 个答案:

答案 0 :(得分:0)

使用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列应与您选择的列匹配。

答案 1 :(得分:0)

使用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)