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

时间:2016-08-03 15:48:47

标签: sql ruby postgresql sql-order-by sql-limit

我正在经历一些SQL练习问题。我目前感到困惑的是要求选择录制了最多摇滚专辑的艺术家,以及专辑的数量。虽然我一起逐个查询,但我遇到了一系列摇滚专辑的问题。

  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似乎正常工作正确答案(["甲壳虫乐队"," 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

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

1 个答案:

答案 0 :(得分:2)

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

通过PostgreSQL运行查询完全正常并且符合预期。

之前在测试块中打印出结果时也会看到正确的顺序
expect(rock_superstars).to ...

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