【发布时间】:2014-12-29 17:51:03
【问题描述】:
编辑:目标是对输出进行排序,以便第一个结果是 store_id = 5 的行和 store_id = 5 的所有项目的最大排名。然后,其余交易根据其排名按降序排列订单,无论他们的 store_id 是什么。对于实际的查询,联合的代价太高了。
数据示例如下:
+----+----------+------+
| id | store_id | rank |
+----+----------+------+
| 1 | 1 | 10 |
+----+----------+------+
| 2 | 5 | 9 |
+----+----------+------+
| 3 | 4 | 8 |
+----+----------+------+
| 4 | 3 | 7 |
+----+----------+------+
| 5 | 3 | 6 |
+----+----------+------+
| 6 | 1 | 5 |
+----+----------+------+
最终运行的查询是:
SELECT id,store_ID,IF(@id=id,rank=rank*9999999,rank) AS rank
FROM (
SELECT * FROM (
SELECT id,rank,store_id
FROM items
) b
JOIN (@id:=(SELECT id FROM b WHERE store_id = 5 ORDER BY rank DESC LIMIT 1)) AS s
)
ORDER BY rank DESC
期望的结果是:
+----+----------+------+
| id | store_id | rank |
+----+----------+------+
| 2 | 5 | 9 |
+----+----------+------+
| 1 | 1 | 10 |
+----+----------+------+
| 3 | 4 | 8 |
+----+----------+------+
| 4 | 3 | 7 |
+----+----------+------+
| 5 | 3 | 6 |
+----+----------+------+
| 6 | 1 | 5 |
+----+----------+------+
此处 (@id:=(SELECT id FROM b WHERE store_id = 5 ORDER BY rank DESC LIMIT 1)) 用于选择 store_id = 5 得分最高的项目。该项目应出现在列表的首位,因此为什么通过将它乘以一个非常大的数字来重新排列它。所有其他排名保持不变,并根据其分数按降序排列。
问题是连接中的 select 语句试图连接来自名为 b 的子查询的选择。但是,表b实际上并不存在于数据库中,所以MySQL说表b不存在。如何引用子查询?实际的子查询非常复杂,所以我没有在此处包含它,但如果有兴趣,您可以在此处查看它的一个版本:MySQL - How To Optimize thie Query。这个问题中的查询只是为了让问题简单。
【问题讨论】:
-
你能不能用一些数据做一个例子,我真的不明白你想要得到什么
-
我已经更新了问题
-
您能举例说明您要完成的工作吗?到目前为止,我不知道你想做什么。
-
您可以添加另一个代表计算排名的
non-existing列,如果 store_id 为 5,则它的值为 2,否则为 1。然后您需要做的就是更改ORDER BY computedRank, rank DESC -
两个问题可能是你的问题。 1) 为什么你有
FROM( FROM(?您是否缺少加入的ON子句?
标签: mysql sql sql-order-by