簡體   English   中英

具有多個子選擇的MySQL SQL選擇查詢

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM