MySQL到PostgreSQL:GROUP BY问题

时间:2009-12-08 06:02:06

标签: sql django postgresql mysql

所以我决定试用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,所以直到那时我们才会付出代价。再次感谢!

3 个答案:

答案 0 :(得分:3)

请查看此链接GROUP BY

  

当GROUP BY存在时,它不是   对SELECT列表表达式有效   引用未分组的列除外   在聚合函数中,因为   会有不止一种可能   要为未分组返回的值   列。

您需要在组中包含所有不属于聚合函数的选择列。

答案 1 :(得分:2)

一些事情:

  1. 放下反引号
  2. 使用CASE语句而不是IF()CASE WHEN votes.use_id = 1 THEN votes.karma_delta ELSE 0 END
  3. 将您的timestampdiff更改为DATE_TRUNC('hour', now()) - DATE_TRUNC('hour', links.created)(您需要在结果间隔内计算小时数。比较时间戳会更容易)
  4. 修正您的GROUP BY和ORDER BY

答案 2 :(得分:1)

尝试将IF替换为case;

SUM(CASE WHEN votes.user_id = 1 THEN votes.karma_delta ELSE 0 END)

您还必须明确命名在GROUP BY子句中使用的每个列或计算列。