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ランク型のレコードを5件、ランク型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 に答える
0

varchar列rank_typeは文字列比較のようにtop5よりもtop20が最初に来るため、結果は実際には昇順です。

上位 5 位と上位 20 位の間だけを処理したい場合は、次のような汚い解決策が考えられます。

ORDER BY rankType desc
于 2013-04-19T13:44:27.773 に答える