MySQL where子句问题

时间:2019-06-01 22:13:39

标签: mysql

SELECT `location`.`building`, `location`.`classroom` FROM `schools`
LEFT OUTER JOIN `location` 
ON `location`.`location_serial` = `classroom`.`location_serial` 
LEFT OUTER JOIN `rack_info` 
ON `classroom_info`.`location_serial` = `classroom`.`location_serial` 
WHERE (
    (((`location`.`building` LIKE 'SCH%')))
    AND 
    (`classroom_info`.`status` NOT IN (1, 2))
    AND 
    (
        (
            (`location`.`building` = 'SCH1' AND `location`.`classroom` != '99')
            AND
            (`location`.`building` = 'SCH1' AND `location`.`classroom` != '34')
        )
    )
)

我的WHERE子句有问题。

比方说location.building可以是SCH1,SCH2,SCH3,SCH4,CAB1,CAB2。我正在尝试选择所有SCH教室,其中某些教室状态为1和2。

一切正常

当我尝试进一步过滤结果以排除建筑物为SCH1且教室ID为99,建筑物为SCH1且教室ID为34的实例时,就会出现问题。我想显示所有其他教室所有SCH建筑物(包括SCH1,例如SCH1.98),但不包括上面的SQL查询中提到的两个特定教室(SCH1.99和SCH1.34)

我可能还想排除其他SCH房间,例如SCH2.24,SCH3.33-但我希望所有其他教室都出现。

我一直在找几个小时,我想我已经达到了我的能力极限-欢迎大家光临。

3 个答案:

答案 0 :(得分:2)

以下是我编写WHERE子句的一些方法:

WHERE location.building LIKE 'SCH%'
  AND classroom_info.status NOT IN (1, 2)
  AND NOT (location.building = 'SCH1' AND location.classroom = '99')
  AND NOT (location.building = 'SCH1' AND location.classroom = '34')


WHERE location.building LIKE 'SCH%'
  AND classroom_info.status NOT IN (1, 2)
  AND NOT (location.building = 'SCH1' AND location.classroom IN ('99', '34'))


WHERE location.building LIKE 'SCH%'
  AND classroom_info.status NOT IN (1, 2)
  AND (location.building, location.classroom) NOT IN (
      ('SCH1', '99'),
      ('SCH1', '34')
  )

这使得添加更多排除案例非常简单。

答案 1 :(得分:1)

条件:

  

排除建筑物为SCH1且教室ID为99的实例

可以写为:

NOT (`location`.`building` = 'SCH1' AND `location`.`classroom` = '99')

或:

(`location`.`building` <> 'SCH1' OR `location`.`classroom` <> '99')

这样做:

SELECT `location`.`building`, `location`.`classroom` FROM `schools`
LEFT OUTER JOIN `location` 
ON `location`.`location_serial` = `classroom`.`location_serial` 
LEFT OUTER JOIN `rack_info` 
ON `classroom_info`.`location_serial` = `classroom`.`location_serial` 
WHERE
    `location`.`building` LIKE 'SCH%'
    AND 
    `classroom_info`.`status` NOT IN (1, 2)
    AND 
    (`location`.`building` <> 'SCH1' OR `location`.`classroom` <> '99')
    AND
    (`location`.`building` <> 'SCH1' OR `location`.`classroom` <> '34')

答案 2 :(得分:1)

要“排除建筑物为SCH1且教室ID为99,而建筑物为SCH1且教室ID为34的实例”,则可以检查建筑物不是'SCH1'或(尤其是在建筑物是'SCH1'),教室ID不在'34''99'中。 (假设教室ID为varchar,否则您可以删除单引号。)

SELECT `location`.`building`,
       `location`.`classroom`
       FROM `schools`
            LEFT OUTER JOIN `location` 
                            ON `location`.`location_serial` = `classroom`.`location_serial` 
            LEFT OUTER JOIN `rack_info` 
                            ON `classroom_info`.`location_serial` = `classroom`.`location_serial` 
       WHERE `location`.`building` LIKE 'SCH%'
             AND `classroom_info`.`status` NOT IN (1,
                                                   2)
             AND (`location`.`building` <> 'SCH1'
                   OR `location`.`classroom` NOT IN ('34',
                                                     '99'));