我有一个mysql查询。
想法是选择日期范围之间的记录。日期存储为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
答案 0 :(得分: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 :(得分: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%')