我在从数据库中选择内容时遇到问题。这是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
必须改变,但我不知道如何。
答案 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
更改为name
。 GROUP 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)
。