1

使用此查询:

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 帮助:使用嵌套 SELECT 在单个查询中计算行数,这是一个好的解决方案(嵌套选择),还是没有其他方法可以做?

提前致谢

4

2 回答 2

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

这可能不是实现这一目标的最佳方法,但它有效(检查这个 SQL Fiddle

于 2013-08-04T16:25:08.670 回答
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 演示。

注意第二个查询中使用的条件(在依赖子查询中):

WHERE ( x.abc, x.def ) = (x1.abc, x1.def)

此语法与 ANSI SQL 一致,但可能不适用于某些旧版本的 MySQL。在这种情况下,将此条件更改为其等效版本:

WHERE x.abc = x1.abc AND x.def = x1.def
于 2013-08-02T17:56:50.097 回答