0

这个查询给出了奇怪的结果:

    SELECT `user_id`,`rankType`
    FROM `ranks`
    WHERE `user_id` =23
    AND (`rankType` = "top5"
    OR `rankType` = "top20")
    ORDER BY rankType
    LIMIT 0 , 30

这里是SQLfiddle

我想要实现的是:

1)只获取top5 rank类型的5条记录,rank类型top20的20条记录

2)我想显示排名类型ascending order的结果。(但如果你在演示小提琴中看到它显示的是恰当的,)may be it is only considering 2 from 20 & 5

4

4 回答 4

3
(SELECT `id`,`user_id`,`rankType`
FROM `ranks`
WHERE `user_id` =23
AND `rankType` = "top5"
ORDER BY rankType
LIMIT 0, 5)

union 

(SELECT `id`,`user_id`,`rankType`
FROM `ranks`
WHERE `user_id` =23
AND `rankType` = "top20"
ORDER BY rankType
LIMIT 0, 20)

如果稍后您想添加另一组排序/过滤列,请将其全部包装成类似

select * from ( /* previous query goes here */ ) tt
where id > 100
order by id

请注意,它ranktype是 varchar,所以它是按字典顺序排序的,所以 top20 < top5。您必须使用自然排序或其他方法才能正确处理。

于 2013-04-19T13:45:47.767 回答
1
SELECT `id`,`user_id`,`rankType`
FROM `ranks`
WHERE `user_id` =23
AND `rankType` = "top5" limit 5
union
SELECT `id`,`user_id`,`rankType`
FROM `ranks`
WHERE `user_id` =23
AND `rankType` = "top20" limit 20
于 2013-04-19T13:49:32.577 回答
0

您的结果实际上是按升序排列的,因为varchar在字符串比较中,列 rank_type 的类型为 top20 比 top5 排在首位。

如果您只想处理 top5 和 top20 之间的问题,一个肮脏的解决方案可能是:

ORDER BY rankType desc
于 2013-04-19T13:44:27.773 回答
0

一种可能性,无需执行两个查询并将它们联合起来:

ORDER BY FIND_IN_SET(rankType,'top5,top20')
于 2013-04-19T13:47:48.297 回答