2013-08-22 26 views
3

在編碼的所有方面,SQL是我最弱的技巧,所以請原諒我,如果我聽起來像我不知道我在說什麼,因爲我可能不會!MySQL使用「in」條件檢索repeatin結果

現狀:
建立一個購物車,其中一個名爲「購物車」表中有一個名爲型的「產品」 VARCHAR 255場,而「產品」的價值將是一個逗號分隔的字符串。字符串的每個元素都將是一個代表「產品」表中產品ID的數字。

客戶的記錄可能在「產品」字段中包含類似1,1,1,2,3的值。這意味着客戶已經增加了三個項目1,項目2之一,和一個項目3

問題:
所以,這裏是SQL語句我有現,但問題是我需要的一個SQL語句會從產品表中返回重複的產品數據:

SELECT product_id, product_name,price 
    FROM products 
WHERE id in ('1','1','1','2','3') 

的,其結果將是一組三個項目從「產品」表,1,2和3。換句話說,它沒有給我三個'1'的產品數據,它只給了我一個獨特的價值。產品表中不是3個值,而是來自產品表的5個值,前三個結果相同,因爲它們是相同的product_id = 1。

我需要一個SQL語句,這將使我的多餘的產品信息,因爲畢竟,一個人可以用的product_id = 1

車李樹斌部件:

id INT(15) 
uid VARCHAR(32) 
email VARCHAR(100) 
products VARCHAR(255) 
date DATETIME 
checkout TINYINT(1) 

產品:

id INT(15) 
product_id varchar(32) 
product_name varchar(128) 
product_associations varchar(255) 
short_description varchar(255) 
long_description mediumtext 
price varchar(32) 
image varchar(128) 

我的PHP代碼:

$productslist = str_replace(",","','",$row->products); 
$productslist = "'" . $productslist . "'"; echo $productslist; 
$sql2 = "SELECT product_id, product_name,price FROM products WHERE id in ($productslist)"; 
$query2 = $this->db->query($sql2); 
$i = 0; 
if ($query2->num_rows() > 0){ 
    foreach ($query2->result() as $row2){ 
     $products[$i]['product_id'] = $row2->product_id; 
     $products[$i]['product_name'] = $row2->product_name; 
     $products[$i]['price'] = $row2->price; 
     $i++; 
    } 
} 

...這查詢的結果將是:

Product ID: #0001 
Product Name: "Ducky" 
Price: $1.50 

Product ID: #0002 
Product Name: "Horse" 
Price: $1499.00 

Product ID: #0003 
Product Name: "T-shirt" 
Price: $5.00 

更新: 在最佳做法的利益,我學的是「標準化」表的理論,然後回滾上述以逗號分隔的產品領域的方案。我創建了一個名爲「cart_list」一個單獨的表,與字段:

id 
cart_id 
product_id 

...我只需插入新記錄爲每個新「加入購物車」,由cart_id場鎖上對車表,通過product_id字段鍵入產品數據。

+3

我認爲你需要正常化你的領域,看起來像'1,1,1,2,3'。 –

+1

如果您不能預先篩選您的ID列表,可以使用SELECT DISTINCT ID或GROUP BY。 – mario

+1

丹尼爾是正確的 - 您需要使用連接購物車和產品的表格,而不是用逗號分隔的列表。 –

回答

3

有點難看,但會做的伎倆:

create temporary table t (id integer); 
insert into t(id) values (1),(1),(2),(2),(3); 


select product_id, product_name,price from t inner join products where t.id = products.id; 

drop table t; 
+1

非常有趣,我會試試這個。謝謝。 – TARKUS

+0

我同意,應用臨時表會有點難看。儘管如此,會做到這一點。 –

+1

是的。這是一個醜陋的黑客。你應該規範你的表格。它提供了一個更好的解決方案,並允許數據庫執行外鍵檢查。例。如果刪除了id爲2的項目,會發生什麼情況。你打算怎麼進去並從場上取下所有的ID? – iWantSimpleLife