使用此查询:
SELECT abc, def, COUNT(*) as c
FROM xpto
GROUP BY abc, def
ORDER BY abc, c DESC
我有这个结果:
xpto
abc | def | c
x | c_1 | 8
...
y | a_2 | 4
y | a_1 | 2
y | a_3 | 1
…
z | b_2 | 7
z | b_1 | 3
...
我希望得到这个结果(按每个abc和字段c的条目数排序):
y | a_2
y | a_1
y | a_3
z | b_2
z | b_1
x | c_1
SQL大师可以帮我完成这项任务吗?我已经看过这个例子SQL Help: Counting Rows in a Single Query With a Nested SELECT,这是一个很好的解决方案(嵌套选择),还是没有其他办法可以做?
提前致谢
答案 0 :(得分:1)
使用嵌套查询:
SELECT abc, def
FROM (
SELECT abc, def, COUNT(*) as c
FROM xpto
GROUP BY abc, def
) alias
ORDER BY abc, c DESC
(来自评论)挑战不是按字母顺序排序abc,而是具有相同值的条目数。我编辑了有问题的例子,以便更好地理解最终目标。
好的,然后只需更改ORDER BY子句中列的顺序:
SELECT abc, def, c
FROM (
SELECT abc, def, COUNT(*) as c
FROM xpto
GROUP BY abc, def
) alias
ORDER BY c DESC, abc;
上面的查询给出了聚合值(即唯一行 - 每对值一行)。
如果您希望列出按条目数排序的表中的所有行,请尝试以下查询:
SELECT abc, def,
( SELECT COUNT(*) FROM xpto x1
WHERE ( x.abc, x.def ) = (x1.abc, x1.def)
) as c
FROM xpto x
ORDER by c desc, abc
;
此查询显示列abc,def + count。如果您只想显示abc + def,而不显示count值,请尝试以下查询:
SELECT abc, def
FROM xpto x
ORDER by ( SELECT COUNT(*) FROM xpto x1
WHERE x.abc = x1.abc AND x.def = x1.def
) desc,
abc
;
查看演示这3个查询的sqlfiddle demo。
注意第二个查询中使用的条件(在从属子查询中):
WHERE ( x.abc, x.def ) = (x1.abc, x1.def)
这种语法是ANSI SQL的抱怨,但可能不适用于某些旧版本的MySQL。在这种情况下,请将此条件更改为其等效版本:
WHERE x.abc = x1.abc AND x.def = x1.def
答案 1 :(得分:1)
检查此查询
SELECT abc, def, COUNT(*) as c,
(SELECT COUNT(1) FROM (
SELECT abc, def, COUNT(*) as c
FROM xpto A
GROUP BY abc, def
) B
GROUP BY ABC
HAVING C.abc=B.abc
) ic
FROM xpto C
GROUP BY abc, def
ORDER BY ic DESC, c DESC
这可能不是达到此目的的最佳方式,但它有效(检查this SQL Fiddle)