2013-06-25 68 views
1

我有一個MySQL查詢。Mysql從unixtime時間戳選擇日期範圍給出太多記錄

這個想法是選擇日期範圍內的記錄。日期存儲爲unix時間戳。通過下面的查詢,我會得到比我應該更多的記錄(超出日期範圍)。

我選了我的大腦,我不能看到查詢出錯的地方。其他領域看起來是正確的,只是我超出了期望的日期範圍。

SELECT 
     mdl_user_info_data.data, 
     mdl_user.firstname, 
     mdl_user.lastname, 
     mdl_grade_grades.itemid, 
     mdl_grade_items.itemname, 
     mdl_quiz.fcpd, 
     mdl_user_info_data.id, 
     mdl_grade_grades.timecreated AS DATE 
     FROM mdl_grade_grades 
     INNER JOIN mdl_user ON mdl_grade_grades.userid = mdl_user.id 
     INNER JOIN mdl_grade_items ON mdl_grade_grades.itemid = mdl_grade_items.id 
     INNER JOIN mdl_quiz ON mdl_grade_items.courseid = mdl_quiz.course 
     INNER JOIN mdl_user_info_data ON mdl_user.id = mdl_user_info_data.userid 
     INNER JOIN mdl_course ON mdl_grade_items.courseid = mdl_course.id 
     WHERE mdl_grade_grades.timecreated BETWEEN (FROM_UNIXTIME(1371704400) AND  FROM_UNIXTIME(1371790800)) 
     AND mdl_user_info_data.fieldid = 1 
     AND mdl_grade_items.itemname IS NOT NULL 
     AND mdl_course.category = 27 
     OR mdl_grade_items.itemname LIKE '%asa%' 
     GROUP BY mdl_user.firstname, mdl_user.lastname, mdl_grade_grades.timecreated 

回答

1

OR項否定一些你內置到WHERE條款的限制,因爲它收集是受您的日期選擇記錄。

你的意思是?

WHERE mdl_grade_grades.timecreated BETWEEN (FROM_UNIXTIME(1371704400) AND 
    FROM_UNIXTIME(1371790800)) 
    AND mdl_user_info_data.fieldid = 1 
    AND mdl_grade_items.itemname IS NOT NULL 
    AND 
    (
    mdl_course.category = 27 
    OR 
    mdl_grade_items.itemname LIKE '%asa%' 
    ) 
1

您需要對WHERE子句中的條件進行分組。

當一行滿足條件OR mdl_grade_items.itemname LIKE '%asa%'它將被選中。

使用()來組合條件。例如:

WHERE mdl_grade_grades.timecreated BETWEEN (FROM_UNIXTIME(1371704400) AND  FROM_UNIXTIME(1371790800)) 
     AND mdl_user_info_data.fieldid = 1 
     AND mdl_grade_items.itemname IS NOT NULL 
     AND (mdl_course.category = 27 OR mdl_grade_items.itemname LIKE '%asa%')