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-但我希望所有其他教室都出现。
我一直在找几个小时,我想我已经达到了我的能力极限-欢迎大家光临。
答案 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'));