2014-01-20 239 views
1

我有一個orders表與一些items涉及到每一個訂單:選擇項目

id | ... | items 
-----+-----+----------------- 
34 | ... | 823, 27, 1657 
678 | ... | 957 
2548 | ... | 92, 823 

orders.items內容存儲爲逗號分隔id的文本字段。 (我知道設計是錯誤的,應該有一個一對多的表來鏈接訂單與物品,但我沒有設計它)。

我需要選擇基於項目的訂單所包含

SELECT id, items FROM orders 
WHERE items LIKE IN (
    SELECT CONCAT('%',id,'%') FROM items 
    WHERE wishlist = 0 

,但顯然這是行不通的,因爲我不能從IN獲得項目的列表使用LIKE。 但是,這是我所需要的,因爲我需要使用%通配符來查找它們。

我該如何做到這一點?

EDIT

在這種SQL Fiddle有我的代碼返回7行和缺少其中2,其中FIND_IN_LIST函數對結果完全相同的效果的例子。

+1

'order'是MySQL中的一個保留字,因此,正如所寫,此查詢在任何情況下都不起作用。但從根本上說,你的問題是正常化(或缺乏)的問題。 FIND_IN_SET會做你想做的,但它是一個很好的替代正常規範化的數據庫。 – Strawberry

+0

我只是爲了說明的目的而選擇了「訂單」這個名字 - 你是對的,我做了錯誤的選擇。但是,這不是我在我的項目中使用的名稱。 – Jago

+0

你的字符串中總是有3個項目嗎? – Mihai

回答

1

試試這個:

SELECT DISTINCT o.id, o.items 
FROM orders AS o 
INNER JOIN items AS i ON FIND_IN_SET(i.id, REPLACE(o.items, ' ', '')) 
WHERE i.wishlist = 0 AND i.cost = 44800; 

入住這SQL FIDDLE DEMO

輸出

| ID |  ITEMS | 
|-----|------------| 
| 154 | 375, 374 | 
| 155 |  377 | 
| 159 |  384 | 
| 172 |  435 | 
| 174 |  440 | 
| 228 | 770, 769 | 
| 229 | 775,841 | 
| 230 |  777 | 
| 528 | 1518, 1517 | 
+0

實際上,我得到的結果與我剛使用普通的'IN'和沒有'CONCAT'的結果相同......返回的結果是正確的,但是結果仍然丟失;並不是所有的結果都被返回。 – Jago

+0

從你對這個問題的描述中可以得出結論(除了它會爲每個訂單帶來一行,每個訂單都很容易修復)。你可以發佈一個SQL小提琴表格和一些測試數據來證明這個問題嗎? – Kickstart

+0

@Kickstart正如你可以在http://sqlfiddle.com/#!2/ffb8b/3/1中看到的,這兩種方法(我的和這個答案中提出的)都返回7行,並且2個從結果中遺漏。 – Jago

0
SELECT id, items FROM `order` WHERE id REGEXP REPLACE(items,',','|'); 

SQL Fiddle

這使得它像這樣,基本上是LIKE的高級版本,'|'是或

select id, items FROM test WHERE id REGEXP '823|167|398'; 
+0

我不是很確定如何將這個'REGEXP REPLACE'函數應用於我的代碼中...請問您可以根據http://sqlfiddle.com/#!2/ffb8b/3/1上的代碼進行詳細說明嗎? – Jago

+0

@Jago http://sqlfiddle.com/#!2/ffb8b/4 – Mihai