gpt4 book ai didi

mysql - sql中的条件Where子句

转载 作者:行者123 更新时间:2023-11-29 04:46:59 24 4
gpt4 key购买 nike

select colA, colB from car
where car.id in (select id from make) and
car.id in (select id from model);

上面的查询按原样完美地工作,假设有一个 make 表没有填充任何东西的情况。只是一张空 table 。有没有办法让连接不在该表上发生?

基本上,如果表有 1 行或多行,则应用 where 条件。否则忽略不限制。

有没有办法在左连接上实现相同的结果?

编辑

结果算法:

  • 从原来的 table 车中选择东西。
  • 如果 make 有任何内容,则删除不在表 make 中的任何内容
  • 如果模型有任何内容,请删除不在表模型中的任何内容....
  • 如果 model2 有任何内容,则删除表 model2 中的任何内容....

这个 model2 是一张我不想要的东西的表格,然后建模并制作我想要的东西的表格。

最佳答案

SELECT colA, colB
FROM car
WHERE ((SELECT COUNT(*) FROM make) = 0) OR id IN (SELECT id FROM make))
AND id IN (SELECT id from model)

使用 LEFT JOIN:

SELECT DISTINCT colA, colB
FROM car
JOIN (SELECT COUNT(*) c FROM make) mcount
LEFT JOIN make ON car.id = make.id
JOIN model ON car.id = model.id
WHERE mcount.c = 0 OR make.id IS NOT NULL

使用 OR 通常可以防止使用索引,因此使用 UNION 可能更好:

SELECT distinct colA, colB
FROM car
JOIN make on car.id = make.id
JOIN model on car.id = model.id

UNION

SELECT distinct colA, colB
FROM car
JOIN (SELECT COUNT(*) c FROM make) make
JOIN model ON car.id = model.id
WHERE make.c = 0

LEFT JOIN 版本扩展到两个表很简单:

SELECT DISTINCT colA, colB
FROM car
JOIN (SELECT COUNT(*) c FROM make) makecount
LEFT JOIN make ON car.id = make.id
JOIN (SELECT COUNT(*) c FROM model) modelcount
LEFT JOIN model ON car.id = model.id
WHERE (makecount.c = 0 OR make.id IS NOT NULL)
AND (modelcount.c = 0 OR model.id IS NOT NULL)

如果还有其他表要连接,您可以继续重复此模式。

使用 UNION 查询执行此操作更难,因为您需要为每个可以为空的连接表组合创建一个子查询:makemodel 都需要一个子查询有行,一行仅用于make,一行仅用于model,还有一行为空。如果有 3 个表被连接,这将扩展到 8 个子查询(即总是有 2n 子查询)。也许有人可以想出更好的方法,我想不出。

关于mysql - sql中的条件Where子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17583298/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com