MySQL:当值不在表中时排序

时间:2016-10-13 16:28:53

标签: mysql

我正在研究一个问题,我有两个表,第一个就像这样:

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,即使它没有出现在列表中,或者是否有任何方法可以使用我目前拥有的东西绕过它?

任何指针都表示赞赏。

2 个答案:

答案 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。