为什么 ORDER BY 仅在与 LIMIT 一起使用时才能在我的查询中正常工作?

Why does ORDER BY only work properly in my query when used with LIMIT?

我正在做一些 SQL 练习题。我目前感到困惑的问题是 select 录制最多摇滚专辑的艺术家,以及专辑的数量。在逐个查询时,我 运行 进入按摇滚专辑数量排序的问题。

  SELECT
    a.artist, COUNT(DISTINCT a.asin)
  FROM
    albums a
  JOIN
    styles s ON a.asin = s.album
  WHERE
    s.style LIKE '%Rock%'
  GROUP BY
    a.artist
  ORDER BY
    COUNT(DISTINCT a.asin) DESC

产生类似:

[["Alanis Morissette", "1"], ["Anne Murray", "1"], ["Billy Joel", "2"] ...      
["The Beach Boys", "1"], ["The Beatles", "7"], ["The Clash", "1"] ...
["Trash Can Sinatras", "1"], ["Travis", "1"], ["U2", "2"], ["Van Morrison", "1"]]

结果仍然按艺术家而不是计数排序。但是,当我添加

LIMIT 1

对于查询,ORDER BY 似乎工作正常,因为正确答案 (["The Beatles", "7"]) 从中间移动到顶部,作为唯一产生的答案。

有人可以解释一下这是怎么回事吗?

注意:我相信通过以下函数将代码写在 Ruby 和 运行 中可能会有所帮助:

require 'pg'

def execute(sql)
  conn = PG::Connection.open(:dbname => 'sqlzoo')
  query_result = conn.exec(sql).values
  conn.close
  query_result
end

此外,这是用于查询的测试 (RSpec):

describe "rock_superstars" do
  it "selects the name of the most prolific rock artist" do
    expect(rock_superstars).to contain_exactly(
      ["The Beatles", "7"]
    )
  end
end

上面的结果是这个测试的输出,因此是数组的形式。

这是一个 ORM 问题,而不是 SQL 问题。感知到的问题是由于 RSpec 在这种情况下打印失败消息的方式。

运行 通过 PostgreSQL 的查询工作得很好并且符合预期。

之前在测试块中打印结果时也看到了正确的顺序

expect(rock_superstars).to ...

因此这个问题似乎与 RSpec 的 contain_exactly 有关。失败时,它会打印出 actual collection contained:,其排序顺序与查询生成的排序顺序不同。