我正在尝试加载由user_id分组并由created_at排序的最新10种艺术.这适用于SqlLite和MySQL,但在我的新PostgreSQL数据库上出错.
Art.all(:order => "created_at desc", :limit => 10, :group => "user_id")
Run Code Online (Sandbox Code Playgroud)
ActiveRecord错误:
Art Load (18.4ms) SELECT "arts".* FROM "arts" GROUP BY user_id ORDER BY created_at desc LIMIT 10
ActiveRecord::StatementInvalid: PGError: ERROR: column "arts.id" must appear in the GROUP BY clause or be used in an aggregate function
LINE 1: SELECT "arts".* FROM "arts" GROUP BY user_id ORDER BY crea...
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
我的数据库(MySQL)中有3个表.
categories (name:string)
items (name:string, category_id:int)
votes (value:int, item_id:int, created_at:datetime)
Run Code Online (Sandbox Code Playgroud)
所以一个类别有很多项目,一个项目有很多选票.
我想编写一个查询来获取最受欢迎的类别,这意味着获取其项目在过去一周内获得最多票数(向上或向下)的类别.
我开始尝试更简单的东西,只是获得受欢迎的项目,但我真的只是猜测这一点,它不起作用.
SELECT *, COUNT(votes.item_id) AS score
FROM items
JOIN votes USING(item_id)
WHERE votes.created_at > #{1.week.ago}
ORDER BY COUNT(votes.item_id) DESC LIMIT 5;
Run Code Online (Sandbox Code Playgroud)
我真的不知道我在做什么,有什么想法吗?此外,如果有人知道如何做更好的高级选择,我很乐意阅读它.MySQL文档有点神秘,我不太了解'AS'和'JOINS'.
我有一个在MySQL上运行良好的查询,现在不在PostgreSQL上这是查询:
SELECT "users".*
FROM "users"
JOIN "favorites" ON "favorites"."user_id" = "users"."id"
WHERE users.id NOT IN (2)
AND favorites.favoritable_id IN (1)
GROUP BY favorites.user_id
ORDER BY RANDOM()
LIMIT 5
Run Code Online (Sandbox Code Playgroud)
这是错误:
列"users.id"必须出现在GROUP BY子句中或用于聚合函数
我查了一下这个错误,但无法找到我必须要解决的问题.
我有这样的查询:
select u.fullname ,s.schedate,
sum(case when s.isvisiting =1 then s.isvisiting else 0 end) as visit ,
count(s.custid) as cust,
sum(case when s.isclosing = 1 then s.isclosing else 0 end)as orders
from vmstrschedule s JOIN vmsmsuser u ON u.usercode = s.salesmanid
where u.branchid = 'BLL' group by u.fullname
Run Code Online (Sandbox Code Playgroud)
但它显示这样的错误:
必须出现在 GROUP BY 子句中或在聚合函数中使用
它在 MySQL 中可以工作,但是当我在 PostgreSQL 中尝试它时,它不起作用。我想每月显示这样的数据:

但如果我使用这个查询:
select u.fullname,s.schedate,
sum(case when s.isvisiting =1 then s.isvisiting else 0 end) as visit ,
count(s.custid) as cust,
sum(case when s.isclosing = 1 …Run Code Online (Sandbox Code Playgroud)