2个表之间的右外连接

时间:2014-04-15 22:07:58

标签: php mysql sql join

我有两个表,一个名为Classes,其中包含ClassName,另一个名为FullSchedule,其中包含的信息包括ClassNameDayVal和{ {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

它向我显示了所有类,无论我如何更改它,它都可以获取所有类或仅使用正在使用的类。如何获得未使用的类?

4 个答案:

答案 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行以及DayValTimeVal的行}值分别等于$day$time

WHERE子句消除了FullSchedule表(ClassNameDayValTimeVal限制)没有匹配记录的行

答案 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;

考虑将日期和时间存储为单个实体。更好,更好的主意。