我有两个表,一个名为Classes
,其中包含ClassName
,另一个名为FullSchedule
,其中包含的信息包括ClassName
,DayVal
和{ {1}}。
我想要做的是,我想选择在特定日期和时间没有使用的类,这是我的查询:
TimeVal
结果是使用 SELECT `Classes`.`ClassName`
FROM `FullSchedule`
RIGHT OUTER JOIN `Classes`
ON `FullSchedule`.`ClassName` = `Classes`.`ClassName`
WHERE `FullSchedule`.`DayVal` = '$day' AND `FullSchedule`.`TimeVal` = `$time`
即使我将其更改为:
RIGHT OUTER JOIN
它向我显示了所有类,无论我如何更改它,它都可以获取所有类或仅使用正在使用的类。如何获得未使用的类?
答案 0 :(得分:1)
试试这个:
SELECT `Classes`.`ClassName`
FROM `Classes`
WHERE Classes`.`ClassName` not in (
SELECT `FullSchedule`.`ClassName`
FROM `FullSchedule`
WHERE `FullSchedule`.`DayVal` = '$day' AND `FullSchedule`.`TimeVal` = `$time` )
答案 1 :(得分:1)
首先从表WHERE
检索FullSchedule
条件的数据,然后RIGHT JOIN
将其转换为Classes
:
SELECT
c.`ClassName`
FROM (
SELECT
`ClassName`
FROM
`FullSchedule`
WHERE
`DayVal` = '$day' AND `TimeVal` = '$time'
) f RIGHT OUTER JOIN `Classes` c
ON f.`ClassName` != c.`ClassName`
答案 2 :(得分:0)
JOIN选项的替代选择:
SELECT c.ClassName
FROM Classes c
WHERE NOT EXISTS ( SELECT *
FROM FullSchedule fs
WHERE fs.DayVal = $day
AND fs.TimeVal = $time
AND fs.ClassName = c.ClassName )
我建议您将所有三种解决方案都放在分析仪中,并比较执行计划,找出最适合您环境的解决方案。
如果绝对需要RIGHT OUTER JOIN
语法:
SELECT c.ClassName
FROM FullSchedule fs
RIGHT OUTER JOIN Classes c
ON fs.ClassName = c.ClassName
AND fs.DayVal = $day
AND fs.TimeVal = $time
WHERE fs.ClassName IS NULL
RIGHT OUTER JOIN
确保Classes
表返回其所有行,然后匹配FullSchedule
上的ClassName
行以及DayVal
和TimeVal
的行}值分别等于$day
和$time
。
WHERE
子句消除了FullSchedule
表(ClassName
,DayVal
和TimeVal
限制)没有匹配记录的行
答案 3 :(得分:0)
SELECT c.ClassName
FROM classes c
LEFT
JOIN FullSchedule s
ON s.ClassName = c.ClassName
AND s.DayVal = '$day'
AND s.TimeVal = '$time' -- <-- NOT BACKTICKS
WHERE s.ClassName IS NULL;
考虑将日期和时间存储为单个实体。更好,更好的主意。