我正在研究一个问题,我有两个表,第一个就像这样:
id | value
1 d
2 e
3 s
4 g
和其他像这样的
value
d
e
e
s
s
我需要根据它们在第二个表中出现的次数对它们进行排序,因此e将首先排序,因为它按字母顺序出现2次并超过s,然后是d。所以最终的结果应该是这样的
id | value
2 e
3 s
1 d
4 g
目前我的这个几乎完全符合我的要求
SELECT table1.id, ordering.count
FROM table1,
(SELECT value, COUNT(*) AS count
FROM table2
GROUP BY value
ORDER BY count) AS ordering
WHERE table1.value = ordering.value
ORDER BY ordering.count DESC, table1.value;
唯一的问题是因为g没有出现在table2中,结果是我想要的结果但没有g的最后一行,因为它没有出现在排序表中。有没有办法可以让它订购它,就好像它是0,即使它没有出现在列表中,或者是否有任何方法可以使用我目前拥有的东西绕过它?
任何指针都表示赞赏。
答案 0 :(得分:1)
为什么不简单
SELECT table1.id, table1.value
FROM table2
INNER JOIN table2 on table1.value = table2.value
GROUP BY value
ORDER BY table2.count(*) desc, table1.value desc
答案 1 :(得分:0)
您的汇总表需要LEFT-JOIN ...
SELECT
table1.id,
table1.value,
coalesce( ordering.count, 0 ) as FinalCount
FROM
table1
LEFT JOIN ( SELECT
value,
COUNT(*) AS count
FROM
table2
GROUP BY
value
ORDER BY count) AS ordering
ON table1.value = ordering.value
ORDER BY
COALESCE( ordering.count, 0 ) DESC,
table1.value
左连接表示在左侧表格中显示所有记录(首先显示的是您的表格1),无论右侧(您的子查询)是否匹配。但是,如果它在子查询中找到记录,请抓住它的计数。 COALESCE()表示如果第一个值为null,则使用下一个 - 在这种情况下,如果找不到匹配则为0。