Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MYSQL非常难选择查询_Mysql_Database_Date_Join_Between - Fatal编程技术网

MYSQL非常难选择查询

MYSQL非常难选择查询,mysql,database,date,join,between,Mysql,Database,Date,Join,Between,所以我有一个围绕驾驶学校构建的场景,在驾驶学校中有员工,他们有不同的角色。我正试图找到一种方法来检查未来几天或几周内员工的具体日程安排。在谷歌上搜索了一个小时不同的BETWEEN和JOINs之后,我找不到一个能让我得到“时间表”的 这是我第一次尝试用我的and和ORs过度使用: SELECT staff.staff_id, lname, interviewstart, lessondate, lessontime, prac_date, prac_time FROM staff, intervi

所以我有一个围绕驾驶学校构建的场景,在驾驶学校中有员工,他们有不同的角色。我正试图找到一种方法来检查未来几天或几周内员工的具体日程安排。在谷歌上搜索了一个小时不同的BETWEEN和JOINs之后,我找不到一个能让我得到“时间表”的

这是我第一次尝试用我的and和ORs过度使用:

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和practical date都是日期格式,interviewstart是一个日期时间,我知道这不会有太大的区别,但你知道的。 这是我见过的最混乱的桌子,绝对没有得到正确的信息。 我期待的结果是这样的:

staff_id    lesson date     practical date  interviewstart
6           2014-12-18      
6                           2014-12-19
6                                           2014-12-15 13:00:00
如果这有意义的话,它只会列出一个基本的清单


请有人在这里试着帮助我,我通常很擅长寻找解决问题的方法,但我的MYSQL没有达到标准!如果代码显示不正确,也很抱歉,我已经尽力了

您错误地使用了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
需要考虑的事项: -在连接条件下使用标准连接语法[INNER/LEFT/RIGHT]连接表 -使用括号表示正确的逻辑,并克服运算符优先级,因为and在OR之前计算 -如果使用GROUP BY,则GROUP BY子句中包含的所有列必须出现在select列表中,反之亦然

下面的查询将帮助您注意到需要检查连接条件

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天。

解释得很好,但拥有所有表格的一些样本数据可能会使问题在理解和发现问题方面变得更好。感谢您的快速反馈,我要寻找的基本结果是,在每个表中显示一个工作人员外键范围内的所有日期/日期时间。请在每个表中发布一些相关数据。如果您想要一个出色的king解决方案,那么如果您提供来自每个表的数据,您的表之间缺少连接,那么它将变得更加容易/可能,因此我怀疑您是否能够轻松解决此问题。简单规则:千万不要在from子句中使用逗号。感谢大家的反馈,我正在根据下面E.Uta的答案制定一个更新的解决方案,我应该提出一个新问题还是更新这篇文章?我是新来的,所以我想尽我所能遵守礼仪。只要用这个,我们就有进步了!它不再制作一个大的混乱列表,但现在它打印出一行,找到正确的工作人员和姓氏。然而,面试、实际日期和它返回的课程日期都只是这些表中的第一个值。谢谢你的帮助。这无疑是一个积极的变化。现在的主要问题是,整个interviewstart列都显示为“空”,但这位工作人员没有任何面试,因此可能是正确的,课程和实际测试结果在工作人员的所有结果之间交替出现。@hateprogramming,好的,你能更具体地说明什么是不正确的吗?是否有可能在问题中添加更多的样本数据,并说明需要哪些数据,哪些不需要原始表格?当然,不是真实的数据。好的,基本结果是一个列表,可以用来查看工作人员的时间表。他可以参与的三个领域是面试、课程和实践测试。我将使用的字段是staff_id INT、lname VARCHAR、interviewstart DATETIME、lessondate DATE、lessontime TIME、prac_DATE DATE、prac_TIME。错误的第一件事是,它在同一行打印一节课和一个实践测试,而不是在17日12:00显示一节课,然后在第二天为prac测试制作一个新行。另一个问题是它不止一次显示结果。我还会在curdate+7之间使用curdate+7吗?还是会发生变化?您应该这样使用,例如:在curdate和curdate+7之间