2011-01-29 9 views
0

私はあなたのために別のものを持っています。私は周りを検索したが、私はこの問題の原因を理解することはできません。複雑なSQLクエリではっきりしています

基本的には、user_idにDISTINCTを実行します。これは、自然に結合されているカラムで、テーブル「user」と「leaderboard_entry」に存在します。

これは素晴らしい作品ですが、重複を除外して最初の最速のユーザースコアのみを表示したいと考えています。内側のクエリは基本的に100個の最新の行を取得し、外側のクエリはleaderboard_entry_elapsed_time_msの昇順でそれらを削除します。

set @t1=0; select * from 
( 
    select @t1 := @t1+1 as leaderboard_entry_youngness_rank, [email protected]/100 as 
    leaderboard_entry_youngness_based_on_expiry, 
    leaderboard_entry.*, 
    NOW()-leaderboard_entry_timestamp as leaderboard_entry_age_in_some_units , 
    TO_DAYS(NOW())-TO_DAYS(leaderboard_entry_timestamp) 
    as leaderboard_entry_age_in_days , leaderboard.leaderboard_quiz_mode , 
    leaderboard.leaderboard_load_key , 
    user.user_name 
    from leaderboard_entry 
    natural join 
    leaderboard 
    natural join 
    user 
    where 
    (leaderboard_load_key = 'es-en-animals-1' 
    or leaderboard_load_key = '-es-en-animals-1') 
    and leaderboard_quiz_mode = '0' 
    order by leaderboard_entry_age_in_some_units asc , 
    leaderboard_entry_timestamp asc limit 0, 100 
) as outer_temp 
order by 
    leaderboard_entry_elapsed_time_ms asc , 
    leaderboard_entry_timestamp asc 
limit 0, 50 

私は「* leaderboard_entry」を削除して、以下を、試してみました、私は必要な列を明示的に命名しそうのようにDISTINCTキーワードを追加しました:

set @t1=0; select * from 
( 
    select @t1 := @t1+1 as leaderboard_entry_youngness_rank, [email protected]/100 as 
    leaderboard_entry_youngness_based_on_expiry,

NOW()-leaderboard_entry_timestamp as leaderboard_entry_age_in_some_units , TO_DAYS(NOW())-TO_DAYS(leaderboard_entry_timestamp) as leaderboard_entry_age_in_days , leaderboard.leaderboard_quiz_mode , leaderboard.leaderboard_load_key , user.user_name

distinct leaderboard_entry.user_id, leaderboard_entry.leaderboard_entry_id, leaderboard_entry.leaderboard_id, leaderboard_entry.leaderboard_entry_timestamp, leaderboard_entry.leaderboard_entry_elapsed_time_ms,

from leaderboard_entry natural join leaderboard natural join user where (leaderboard_load_key = 'es-en-animals-1' or leaderboard_load_key = '-es-en-animals-1') and leaderboard_quiz_mode = '0' order by leaderboard_entry_age_in_some_units asc , leaderboard_entry_timestamp asc limit 0, 100 ) as outer_temp order by leaderboard_entry_elapsed_time_ms asc , leaderboard_entry_timestamp asc limit 0, 50

しかし、私はこれを取得エラーと、それは意味がありません... :(

#1064 - You have an error in your SQL syntax; 
check the manual that corresponds to your MySQL 
server version for the right syntax to use near 
'distinct leaderboard_entry.user_id, leaderboard_entry.leaderboard_entry_id, ' 
at line 12 

すべてのヘルプははるかに高く評価! 豚

+2

あなたは 'GROUP BY'節を見ましたか? http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html –

+0

'distinct'は行に作用しますが、特定の列のみに適用することはできません。また、' distinct'キーワードは必須です'SELECT'の後に来て、カラムの前に来る –

+0

ありがとう!どの集計関数を使用しますか?私は何かを合計したくないなど – swinefeaster

答えて