1

我有一个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
4

2 回答 2

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%'
    )
于 2013-06-25T08:35:32.217 回答
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%')
于 2013-06-25T08:37:57.130 回答