2013-06-25 2 views
1

У меня есть запрос mysql.Mysql выбор диапазона дат от unixtime timestamp дает слишком много записей

Идея состоит в том, чтобы выбирать записи между диапазоном дат. Даты хранятся как временные метки 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%') 
Смежные вопросы