所以我决定试用PostgreSQL而不是MySQL,但我遇到了一些轻微的转换问题。这是我的一个查询,它从四个表中对数据进行采样并将结果全部吐出来。
我不知道如何在PostgreSQL中传达这一点,特别是在Django中,但是如果你可以Django-fy那么我会把它留给另一个问题所以奖励积分但是如果你只是纯粹的SQL就不用担心。
SELECT links.id, links.created, links.url, links.title, user.username, category.title, SUM(votes.karma_delta) AS karma, SUM(IF(votes.user_id = 1, votes.karma_delta, 0)) AS user_vote
FROM links
LEFT OUTER JOIN `users` `user` ON (`links`.`user_id`=`user`.`id`)
LEFT OUTER JOIN `categories` `category` ON (`links`.`category_id`=`category`.`id`)
LEFT OUTER JOIN `votes` `votes` ON (`votes`.`link_id`=`links`.`id`)
WHERE (links.id = votes.link_id)
GROUP BY votes.link_id
ORDER BY (SUM(votes.karma_delta) - 1) / POW((TIMESTAMPDIFF(HOUR, links.created, NOW()) + 2), 1.5) DESC
LIMIT 20
选择中的IF是我第一次遇到麻烦的地方。似乎它是一个IF真/假那么东西ELSE其他东西结束但是我无法正确理解语法。我尝试使用Navicat的SQL构建器,但它一直希望我将我选择的所有内容放入GROUP BY中,并且我认为它有各种各样的错误。
我正在寻找的是使这个MySQL查询在PostreSQL中工作。谢谢。
当前进度
只想感谢大家的帮助。这就是我到目前为止所做的:
SELECT links_link.id, links_link.created, links_link.url, links_link.title, links_category.title, SUM(links_vote.karma_delta) AS karma, SUM(CASE WHEN links_vote.user_id = 1 THEN links_vote.karma_delta ELSE 0 END) AS user_vote
FROM links_link
LEFT OUTER JOIN auth_user ON (links_link.user_id = auth_user.id)
LEFT OUTER JOIN links_category ON (links_link.category_id = links_category.id)
LEFT OUTER JOIN links_vote ON (links_vote.link_id = links_link.id)
WHERE (links_link.id = links_vote.link_id)
GROUP BY links_link.id, links_link.created, links_link.url, links_link.title, links_category.title
ORDER BY links_link.created DESC
LIMIT 20
我不得不更改一些表名,我仍在处理我的ORDER BY,所以直到那时我们才会付出代价。再次感谢!
答案 0 :(得分:3)
请查看此链接GROUP BY
当GROUP BY存在时,它不是 对SELECT列表表达式有效 引用未分组的列除外 在聚合函数中,因为 会有不止一种可能 要为未分组返回的值 列。
您需要在组中包含所有不属于聚合函数的选择列。
答案 1 :(得分:2)
一些事情:
CASE WHEN votes.use_id = 1 THEN votes.karma_delta ELSE 0 END
DATE_TRUNC('hour', now()) - DATE_TRUNC('hour', links.created)
(您需要在结果间隔内计算小时数。比较时间戳会更容易)答案 2 :(得分:1)
尝试将IF
替换为case
;
SUM(CASE WHEN votes.user_id = 1 THEN votes.karma_delta ELSE 0 END)
您还必须明确命名在GROUP BY子句中使用的每个列或计算列。