我是MySQL的新手,我正在尝试了解有关JOIN功能的更多信息.
假设我有以下代码,我想找到变量的每个级别的计数,然后加入两列.所以数据看起来像:
in_clicks:
one
one
one
two
three
four
four
four
four
four
five
five
six
seven
seven
seven
eight
Run Code Online (Sandbox Code Playgroud)
我正在尝试生成以下输出:
four 5
one 3
seven 3
five 2
two 1
three 1
six 1
eight 1
Run Code Online (Sandbox Code Playgroud)
对JOIN函数一无所知,我可以使用类似于以下代码的东西来获得我想要的结果.(它不起作用)
SELECT(SELECT * FROM in_clicks) AS keys,
(SELECT COUNT(*) FROM in_clicks) AS KeysNum;
Run Code Online (Sandbox Code Playgroud)
但是,如何使用JOIN函数来优化我的sql代码?
你根本不需要加入.假设这number
是您列出的列:
SELECT number, COUNT(number)
FROM in_clicks
GROUP BY number
ORDER BY COUNT(number) DESC
Run Code Online (Sandbox Code Playgroud)
该COUNT()
聚合函数基本上计算行数.(COUNT(*)
本来也可以.)这里的魔力是GROUP BY number
指示数据库按不同的值对结果进行分组number
.聚合函数将分别评估每个组.由于"四"组中有五行,因此COUNT()
该组将产生5行.
选择number
列是可能的,因为我们已按其分组; 没有GROUP BY number
我们不能*选择number
聚合,因为这是没有意义的.选择此列可以查看相应聚合结果所属的组.
该ORDER BY
子句应该是不言自明的......按照该组中的行数对结果进行排序.注意,未指定计数相同的行的顺序; ORDER BY COUNT(number) DESC, number ASC
如果你想先通过递减计数,然后number
按升序排序,你可以这样做...但请注意,这将是一个文本比较,所以订单将是四,一,七,五,八,六,三,二.如果您只按计数订购,则一/七和两/三/六/八行的相对顺序将不可靠,因为它们具有相同的计数.
* 其实这是可以在MySQL中选择不包含在GROUP BY非聚集列,但是这是不规范的,应极为谨慎使用.在这里阅读更多相关信息.