新手问题 请教一个 SQL 得疑问

benzhang · 2014年09月05日 · 最后由 wuwx 回复于 2014年09月08日 · 2305 次阅读

我用得是 PostgreSQL,生成了下面得两个 SQL 语句。我遇到很郁闷得问题就是我运行完了第一条语句,运行第二条语句却发现得出得 coupon 并没有设置 popluar。也就是说同样得一条 SQL 得出的顺序却是不一样的(设置了 order by)。请问下我有什么地方遗漏了吗?

UPDATE "coupons" SET "popular" = 't' WHERE "coupons"."id" IN (SELECT "coupons"."id" FROM "coupons" ORDER BY user_coupons_count DESC LIMIT 1)
SELECT "coupons".* FROM "coupons" ORDER BY user_coupons_count DESC LIMIT 1

你的问题能描述的清楚一点吗?还有你要解决什么问题?

user_coupons_count 哪儿来的?

#1 楼 @tiseheaini 抱歉,我描述的不太清楚。我的意思是为什么 SELECT "coupons"."id" FROM "coupons" ORDER BY user_coupons_count DESC LIMIT 1 这条语句在第一行代码的子嵌套里面返回的值跟第二行代码的返回值会不一样?他们都在同一个 commit 里面运行的,照理说应该是会一样的。

#2 楼 @steven_yue user_coupons_count 是 coupons 里的

假如你有一样 user_coupons_count 值的 2 条记录会怎么样呢…… 另外为啥不暴力一些直接 update order limit 而要子查询?

#3 楼 @benzhang 你在 psql 的命令行里用生成的语句运行一下,然后模拟一下 update 的行为,更新一条语句,再查询一下看看结果。 按照 @wuwx 所说,可能有两条一样的记录使得查询出来的内容不一致。 手工模拟一下运行过程可能会找到出现问题的地方。

@wuwx 其实这个是 ActiveRecord 生成得 SQL 来的。这个是项目中出现得一个 bug,虽然 bug 已经修复,但我想去找到产生问题得根源,就找到了这两行代码。原因就是有两条数据得 user_coupons_count 是一样得,然后得出得结果得顺序不一样。

#7 楼 @benzhang 看来你还可以考虑增加第二个 order 的条件了

需要 登录 后方可回复, 如果你还没有账号请 注册新账号