2012-02-11 10 views
0

こんにちは。グループによるクエリによる単一の結果by

特定のユーザーの最後の繰り返しの日付が今日よりも早い、または繰り返しがないすべての単語を取得したいと思います。

私はこれに似ていますが、間違っています。

SELECT * FROM `Word` w LEFT JOIN (
    SELECT * FROM `Repetition` 
    GROUP BY word_id 
    ORDER BY next DESC 
) r ON w.id = r.word_id 
WHERE wordset_id = 1 AND (r.user_id IS NULL) OR r.next < CURRENT_DATE 

「サブクエリ」は、特定のユーザー/ワードの組み合わせ

私が取得したいために、最後の繰り返しのテーブルを返す必要があります:任意の繰り返しを持っているか持っていないすべての単語を以前か、今日の意味(原因)繰り返し(どちらも特定のユーザーの場合)

答えて

0

問題は完全には理解できないかもしれませんが、言い換えれば、今日は繰り返しのないすべての単語を返そうとしていますか?

SELECT * FROM word 
WHERE word_id NOT IN (
    SELECT word_id FROM repetition WHERE next >= CURRENT_DATE 
) 

何かそんなことがあるのでしょうか? wordset_idやuser_idで何をしようとしているのかは分かりません。

+0

すべての原因(原因は、以前の意味や今日)任意の繰り返しを持っているか持っていない言葉の繰り返しは – greg606

0
SELECT * FROM `Word` w LEFT JOIN 
(SELECT word_id, user_id, `repNo`, `repCount`, `date`, `ef`, MAX(next) next 
FROM `Repetition` GROUP BY `word_id`,`user_id`) r ON w.id = r.word_id 
WHERE wordset_id = 1 AND (r.user_id IS NULL) OR r.next < CURRENT_DATE 
+0

はたぶん、あなたはDQLでそれを書く方法を知っていますか? – greg606

+0

これはうまくいくようですが、repNo、repCount、date、およびefの値が正しくない可能性があります。 http://dev.mysql.com/doc/refman/5.5/en/group-by-hidden-columns.htmlを確認してください – piotrm

+0

あなたはどのように書きますか? – greg606

0

ここでサブクエリを使用する必要はないと思いますが、結合するだけで問題ありません。 (特定のユーザーのための両方)

SELECT words.* 
FROM words 
-- Left join makes sure that you get one result for each word 
LEFT JOIN Repetition ON (
    (Words.id = Repetition.word_id) 
    -- Get just one user's result 
    AND (Repetition.user_id = ?) 
) 
-- And filter today's results: 
WHERE (Repetition.id IS NULL) OR (Repetition.next < NOW()) 
GROUP BY Words.id 
関連する問題