2009-08-10 10 views
0

私はviewsという名前の列を持つテーブルを持っています。ユーザーがページを更新するたびに、ビュー数+1が更新されます。
何をしようとしているのかは、ビューカウントに基づいて行のリストを出力するmysqlクエリを作成することです。mysqlは最高値から最低値の順に行を表示します

これは私がそれはそのすべての調子が悪い昇順閲覧しても

SELECT * FROM picdb ORDER BY views DESC LIMIT 10 

を働くだろうと思ったものです。

思考?

EDIT 列の型がTEXT

ではINTする変更列の型を解決し、それが今で正常に動作します。それを指摘してくれてありがとう。

+1

ビューの列の日付の種類は何を使うのか? – Nate

+0

そのことを忘れていました...投稿更新 – mrpatg

+2

なぜ列の種類のテキストですか?そこには数字以外のものはありますか?数値フィールドの場合は、おそらく正しく順序付けられます。 –

答えて

3

カラムタイプがTEXTの場合、デフォルトのソート動作ではデータが文字列として扱われるため、アルファベット順(数値ではありません)でソートされます。

列の種類を数値型に変更すると、正しく並べ替えられます。

3
SELECT 
    * 
FROM 
    tbl 
ORDER BY 
    CAST(views AS UNSIGNED) DESC 
LIMIT 
    10 

トリックを行う可能性があります。実際の質問は、テキスト型の整数を含む列がある理由です。

+0

ありがとう、あなたは私を救った! –

1
select a,b,CAST(views AS UNSIGNED) c from picdb order by c desc limit 10 
1

これは古典的な英数字ソートの問題のようです。列の種類がテキストの場合、おそらく1、10、15、20、3のような順序が表示されます。つまり、整数値ではなくテキスト値でソートされます。

あなたは数値型に列を変更することができ、またはあなたが行うことができます:

SELECT * FROM picdb ORDER BY CONVERT(views, UNSIGNED INTEGER) DESC LIMIT 10 

しかし、これはviews列上の任意のインデックスを利用することはできません。それが実際に表現されている場合は、列を数値型に変更する方がよいでしょう。

0

テーブル行をからに、より高い値から低い値に変更する場合はこのクエリを使用します。

query = "SELECT * FROM CurrencyTable ORDER BY CAST(currency_rate AS UNSIGNED) DESC"; 

そして、あなたがより高い値に低い値から行を表示したい場合は、このクエリ

query-2 = "SELECT * FROM CurrencyTable ORDER BY CAST(currency_rate AS UNSIGNED) ASC"; 
関連する問題