[英]MySQL SQL Select Query with Multiple Sub-Selects
好,所以这个让我扯了几个小时。 我觉得有些明显的事情我正在忽略。
我有2张桌子, 服务和品牌
service
-------
id
brand
brand
-----
id
brandName
因此,service.brand可以是以下任意一种:
Blank
"Other"
Integer (matches brand.id)
String (matches brand.brandName)
String (Not Blank, Not Other, Not brand.brandName)
我正在尝试编写一个查询,该查询将从brand表中拉出正确的brandname,如果service.brand的值不在brand.id或brand.brandName中,则显示其中的内容。
到目前为止,我已经做好了所有工作,但是如果service.brand不为空,不是Other,不在brand.id中,不在brand.brandName中,则不会提高记录。 (从现在开始,我将其称为OtherThanOther)。
现在,我的最新尝试几乎是正确的,但是OtherThanOther字段却被拉很多次,例如总记录为40,OtherThanOther几乎是同一记录的20倍。 救命!
我最近的尝试
select
s.*, b.brandName as bname
from
service s, brand b
where
s.brand = b.brandName
or
s.brand = b.id
or
s.brand = 'Other'
or
s.brand = ''
or
(
s.brand not in (select brandName from brand)
and
s.brand not in (select id from brand)
and
s.brand != 'Other'
and
s.brand != ''
)
样本表数据
service
-------
1 5
2 Dell
3 SomeRandom
4
5 Other
brand
-----
1 HP
2 Gateway
3 Dell
4 Compaq
5 Toshiba
我的查询结果
(service.id, service.brand, brand.id, brand.brandName, bname)
-------------------------------------------------------------
1 5 5 Toshiba Toshiba
2 Dell 3 Dell Dell
3 SomeRandom, brand.id, brand.brandName, brand.brandName
3 SomeRandom, brand.id, brand.brandName, brand.brandName
3 SomeRandom, brand.id, brand.brandName, brand.brandName
3 SomeRandom, brand.id, brand.brandName, brand.brandName
3 SomeRandom, brand.id, brand.brandName, brand.brandName
4 '', null, null, null
5 Other, null, null, null
我需要它只拉一次SomeRandom,分组依据将无法工作,因为可能有多个字段的值与SomeRandom相同。 任何帮助深表感谢。
谢谢!
select
s.*,
CASE
WHEN b_id.brandName IS NOT NULL THEN b_id.brandName
WHEN b.brandName IS NOT NULL THEN b.brandName
ELSE s.brand
END as bname
from
service s
LEFT JOIN brand b_id
ON CAST(s.brand AS UNSIGNED) = b_id.id
LEFT JOIN brand b
ON s.brand = b.brandName
您正在使用旧式inner join
:
from service s, brand b
where s.brand = b.brandName or ...
更清晰地写为:
from service s
inner join brand b on s.brand = b.brandName or ...
在较新的形式中,问题立即突出。 inner join
过滤出不匹配的行。 使用left join
:
from service s
left join brand b on s.brand = b.brandName or ...
现在,即使在brand
表中未找到匹配的行,您也将获得所有服务。
您应该JOIN
具有多个条件的2个表。 像这样:
SELECT s.*, b.brandName AS bname
FROM service AS s
INNER JOIN brand AS b
ON s.brand = b.brandName OR
s.brand = b.id OR
s.brand = 'Other' OR
s.brand = '' OR
(s.brand NOT IN (SELECT brandName FROM brand) AND
s.brand NOT IN (SELECT id FROM brand) AND
s.brand != 'Other' AND
s.brand != '')
第一件事-使用JOIN!
select s.*, b.brandName as bname
from service s
LEFT JOIN brand b ON s.brand = b.brandName or s.brand = b.id
然后,您可以添加WHERE NOT s.brand IS NULL
条件-例如WHERE NOT s.brand IS NULL
您的这些情况导致表行彼此相乘的结果:
s.brand = 'Other'
or
s.brand = ''
or
(
s.brand not in (select brandName from brand)
and
s.brand not in (select id from brand)
and
s.brand != 'Other'
and
s.brand != ''
)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.