2016-04-26 35 views
1

我試圖建立一個查詢,其中的內容與搜索匹配的所有變體。 例如,根據下表我想包含內容=「紅色」MySQL鏈接字段匹配時選擇行

------------------------------------------- 
| ID | Product | Variant | Option | Content | 
------------------------------------------- 
| 1 | Shirt | 1  | size | S  | 
| 2 | Shirt | 1  | color | red  | 
| 3 | Shirt | 2  | size | M  | 
| 4 | Shirt | 2  | color | red  | 
| 5 | Shirt | 3  | size | L  | 
| 6 | Shirt | 3  | color | red  | 
| 7 | Shirt | 4  | size | M  | 
| 8 | Shirt | 4  | color | blue | 
------------------------------------------- 

我想結果是所有變體是這樣的:

------------------------------------------- 
| ID | Product | Variant | Option | Content | 
------------------------------------------- 
| 1 | Shirt | 1  | size | S  | 
| 2 | Shirt | 1  | color | red  | 
| 3 | Shirt | 2  | size | M  | 
| 4 | Shirt | 2  | color | red  | 
| 5 | Shirt | 3  | size | L  | 
| 6 | Shirt | 3  | color | red  | 
------------------------------------------- 

而結果當內容= M時,會是這樣的

------------------------------------------- 
| ID | Product | Variant | Option | Content | 
------------------------------------------- 
| 3 | Shirt | 2  | size | M  | 
| 4 | Shirt | 2  | color | red  | 
| 7 | Shirt | 4  | size | M  | 
| 8 | Shirt | 4  | color | blue | 
------------------------------------------- 

我希望這是有道理的。 謝謝!

我做了一個小提琴 http://sqlfiddle.com/#!9/63e64e/2

+0

sqlfiddle.com提供的很好的問題+1 –

回答

1

使用自聯接

SELECT v1.* 
FROM variant AS v1 
JOIN variant AS v2 ON v1.variant = v2.variant 
WHERE v2.content = 'red' 

這在功能上等同於Tin Tran的查詢,但不需要編寫子查詢,因此它更簡單一些。您需要檢查EXPLAIN輸出以確保它們的處理方式相同。

+0

謝謝,像魅力一樣,ii可以在這裏建立第二個過濾器:http://sqlfiddle.com/#!9/be3bbe/6使用以下查詢SELECT v1。* FROM變體AS v1 JOIN變體AS v2 ON v1.variant = v2.variant WHERE v2。內容='S' 加入變體AS v3 ON v1.variant = v3.variant WHERE v3.content ='winter' – Rafanake

+0

所有的'JOIN'子句先出現,然後單個'WHERE'子句用AND之間的條件。 – Barmar

+0

你可能想做'SELECT v1。* FROM variant AS v1 JOIN variant AS v2 ON v1.variant = v2.variant WHERE v2.content ='S'OR v2.content ='winter'' –

1
SELECT v.id,v.product,v.variant,v.option,v.content 
FROM variant v 
INNER JOIN (SELECT variant FROM variant WHERE content = 'red')v2 
ON v.variant = v2.variant 
ORDER BY ID ASC 

只是改變'red''M',如果你想獲得你的其他結果。

http://sqlfiddle.com/#!9/63e64e/7

我在你sqlfiddle注意到它有M和黃色的變體,將在結果中顯示出來,如果你設置了「紅」串「M」

+0

非常感謝,這幫了我很多! – Rafanake

1
SELECT * 
FROM variant 
WHERE 
variant.variant 
IN 
(
    SELECT variant.variant 
    FROM variant 
    WHERE variant.content = 'red' 
) 

這應該比較容易理解。您有一個內部查詢,首先使用可用選項搜索每個變體。然後你有外部查詢來搜索從變體搜索返回的所有變體的所有值。更優雅的方式來寫,這可能是這樣的,

SELECT * 
FROM variant 
INNER JOIN 
(
    SELECT variant2.variant 
    FROM variant variant2 
    WHERE variant2.content = 'red' 
) variant2 
ON variant.variant = variant2.variant 

在這個例子中,你將不得不名返回的表中的至少一個來區分他們。這是因爲你正在調用同一個表的兩個實例。

SELECT * 
FROM variant 
JOIN variant AS variant2 ON variant.variant = variant2.variant 
WHERE variant2.content = 'red' 

下面是另一個輸出相同結果的示例。與此不同的是,您正在單個查詢中運行它。

的良好來源,瞭解加入其中,從可以在這裏找到:https://technet.microsoft.com/en-us/library/ms191472(v=sql.105).aspx

我最喜歡的圖表上聯接可以在這裏找到:http://www.codeproject.com/KB/database/Visual_SQL_Joins/Visual_SQL_JOINS_orig.jpg它遺漏了一些技巧,但它確實給了良好的基本思路你可以用連接做什麼。

+0

謝謝,生病檢查這些鏈接! – Rafanake

+0

MySQL在優化'WHERE col IN(SELECT ...)'查詢方面臭名昭着,所以儘量避免它們。 – Barmar