我正在经历一些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
以上结果是此测试的输出,因此是数组的形式。
答案 0 :(得分:2)
这是一个ORM问题,而不是SQL问题。感知问题是由于RSpec在这种情况下打印失败消息的方式。
通过PostgreSQL运行查询完全正常并且符合预期。
在
之前在测试块中打印出结果时也会看到正确的顺序expect(rock_superstars).to ...
因此,这个问题似乎与RSpec的contain_exactly
有关。失败后,它会打印出actual collection contained:
,其排序顺序与查询生成的排序顺序不同。