mysql查询(多个计数)

时间:2013-08-02 15:23:04

标签: mysql sql count group-by

使用此查询:

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,这是一个很好的解决方案(嵌套选择),还是没有其他办法可以做?

提前致谢

2 个答案:

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