所以我有一个围绕驾驶学校的场景,在这个驾驶学校内是工作人员,他们有不同的角色。我正试图找到一种方法来检查即将到来的几天或一周的特定工作人员时间表。经过一个小时的谷歌搜索BETWEEN和JOIN的不同变化后,我找不到一个允许我得到“时间表”的。
这是我第一次尝试使用我的AND和OR进行过度杀伤:
SELECT staff.staff_id, lname, interviewstart, lessondate, lessontime, prac_date, prac_time
FROM staff, interviews, lessons, practicaltests
WHERE staff.staff_id = 6 AND lessondate OR practicaldate OR interviewstart BETWEEN curdate() AND '2014-12-21'
GROUP BY staff_id
Lessondate和实际日期都是DATE格式和interviewstart是DATETIME(我知道这并没有太大的区别,但只是你知道。) 这返回了我见过的最脏的桌子,绝对没有得到正确的信息。 我期待的结果是这样的:
staff_id lesson date practical date interviewstart
6 2014-12-18
6 2014-12-19
6 2014-12-15 13:00:00
如果这有意义,它只会制作一个基本列表。
请有人试着在这里帮助我,我通常很擅长看到解决问题的方法,但我的MYSQL还没有达到标准! (如果代码没有正确显示,也很抱歉,尽我所能!)
答案 0 :(得分:0)
您错误地使用了OR运算符。试试这个:
SELECT staff.staff_id, lname, interviewstart, lessondate, lessontime, prac_date, prac_time
FROM staff, interviews, lessons, practicaltests
WHERE staff.staff_id = 6 AND (lessondate BETWEEN curdate() AND '2014-12-21' OR practicaldate BETWEEN curdate() AND '2014-12-21' OR interviewstart BETWEEN curdate() AND '2014-12-21') GROUP BY staff_id
答案 1 :(得分:0)
需要考虑的事项:
- 使用标准连接语法([INNER / LEFT / RIGHT] JOIN表ON join_condition
- 使用括号表示正确的逻辑并克服运算符优先级(因为AND在OR之前计算)
- 如果使用GROUP BY,那么GROUP BY子句中包含的所有列必须出现在选择列表中(或反之亦然)。
以下查询可以帮助您(注意您需要检查加入条件)
SELECT staff.staff_id, lname, interviewstart, lessondate, lessontime, prac_date, prac_time
FROM staff
LEFT JOIN interviews
ON staff.staff_id = interviews.staff_id
LEFT JOIN lessons
ON staff.staff_id = lessons.staff_id
LEFT JOIN practicaltests
ON staff.staff_id = practicaltests.staff_id
WHERE staff.staff_id = 6
AND (
lessons.lessondate BETWEEN curdate() AND '2014-12-21'
OR practicaltests.practicaldate BETWEEN curdate() AND '2014-12-21'
OR interviews.interviewstart BETWEEN curdate() AND '2014-12-21'
)
注意:您可以使用curdate()+7
代替硬编码日期。这意味着将7天添加到当前日期。