2011-07-12 144 views
0

我會盡力詳細介紹這一點。我有一個帶有where子句的嵌套select語句,但select的嵌套部分應該被解釋爲一個文字字符串(我相信這是正確的術語)。然而,MySQL的默認行爲導致我不想要的結果。使用「where in」子句嵌套的MySql Select語句

I.e.

select class 
from cs_item 
where code="007" 

+-------+ 
| class | 
+-------+ 
| 1,3 | 
+-------+ 

及以下的是,如果我明確地「在(1,3)」作爲選擇查詢的一部分鍵入查詢:

select alpha,description 
from cs_quality 
where class in (1,3); 

+-------+-------------+ 
| alpha | description | 
+-------+-------------+ 
| STD | STD   | 
| XS | XS   | 
| 5  | Sch 5  | 
| 10 | Sch 10  | 
| 20 | Sch 20  | 
| 40 | Sch 40  | 
| 60 | Sch 60  | 
| 80 | Sch 80  | 
| 100 | Sch 100  | 
| 120 | Sch 120  | 
| 140 | Sch 140  | 
| 160 | Sch 160  | 
| XXS | XXS   | 
| 15L | 150#  | 
| 30L | 300#  | 
| 40L | 400#  | 
| 60L | 600#  | 
| 90L | 900#  | 
| 150L | 1500#  | 
| 200L | 2000#  | 
| 250L | 2500#  | 
| 300L | 3000#  | 
| 400L | 4000#  | 
| 600L | 6000#  | 
| 900L | 9000#  | 
+-------+-------------+ 

但是當我去鳥巢此得到同樣的結果我有...

select alpha,description 
from cs_quality 
where class in (select class from cs_item where code = "007") 

+-------+-------------+ 
| alpha | description | 
+-------+-------------+ 
| STD | STD   | 
| XS | XS   | 
| 5  | Sch 5  | 
| 10 | Sch 10  | 
| 20 | Sch 20  | 
| 40 | Sch 40  | 
| 60 | Sch 60  | 
| 80 | Sch 80  | 
| 100 | Sch 100  | 
| 120 | Sch 120  | 
| 140 | Sch 140  | 
| 160 | Sch 160  | 
| XXS | XXS   | 
+-------+-------------+ 

這僅僅是「類1」的一部分......這不太願意了」,3" 組件上。有沒有辦法將嵌套選擇解釋爲文本文本?

謝謝大家,非常感謝。對於這個問題,我有點麻煩,但會根據需要進行編輯。

+2

規範化您的數據模型。不要在一列中存儲文字「1,3」。 –

回答

7

規範化,標準化,規範化的表格,在這種情況下表cs_item。您不應該在一個字段中存儲多個(逗號分隔)值。

直到你做到這一點,你可以使用:

select alpha, description 
from cs_quality 
where FIND_IN_SET(class , (select class from cs_item where code = '007')) 

select q.alpha, q.description 
from cs_quality AS q 
    join cs_item AS i 
    on FIND_IN_SET(q.class , i.class) 
where i.code = '007' 

但這種使用特殊功能,而不是平等的JOIN的,導致非常慢的查詢。存儲逗號分隔列表會導致很多其他問題。在這裏看到:

簡短的回答是:是的,這是不好的

+0

非常感謝ypercube,很好的回答和信息:) – jparanich

5

您的查詢需要回到這樣的多行:

+-------+ 
| class | 
+-------+ 
| 1 | 
+-------+ 
| 3 | 
+-------+ 

要不然這是因爲如果你正在做的:

select alpha,description 
from cs_quality 
where class in ("1, 3"); 

你不想要的。

0

更好地利用join,代替嵌套查詢