2012-02-11 136 views
0

请帮我写这个查询。单个查询结果由

我想获得所有用于给定用户的最后一次重复的日期早于今天的所有单词,或者没有重复。

我有这样的,但它是不正确的。

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 2012-02-11 19:47:06

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 2012-02-11 20:26:54

+0

它似乎可行,但repNo,repCount,date和ef的值可能不正确。检查http://dev.mysql.com/doc/refman/5.5/en/group-by-hidden-columns.html – piotrm 2012-02-11 20:27:21

+0

那么你会怎么写呢? – greg606 2012-02-11 20:39:12

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