2011-09-13 82 views
0

我對我們的產品數據庫,如:的mysql_query幫助

id: 5 
catid: 2,4,26,33,46 
name: product one 
etc... 

對於各家店的產品catid存儲多個類別ID分離與作爲一個產品可能出現在多個類別的逗號。 如何查看ID 26類別的產品?

我的第一個想法是:

mysql_query("SELECT * FROM products WHERE catid LIKE '%26%'"); 

,但它不工作以及它也顯示由2和46類產品。

+3

您不應該將多個數據放入具有數據庫的列中。看看[數據庫規範化](http://en.wikipedia.org/wiki/Database_normalization)。您應該考慮在類別和產品之間使用鏈接表,並使用MySQL [JOIN](http://dev.mysql.com/doc/refman/5.0/en/join.html)子句。 – Bojangles

回答

1

使用FIND_IN_SET()功能:SELECT * FROM products where FIND_IN_SET(26, catid) > 0

+0

非常感謝你,這只是根據需要。感謝您的快速回答。 – wzazza

-1

這將做到這一點。

SELECT * FROM products WHERE catid IN (26); 

這應該完成你正在尋找的東西。

這也可以用來擴展您的選擇。

SELECT * FROM products WHERE catid IN (26,27); 
+0

作爲對@JamWaffles的評論,如果您正在構建一個體面的EAV結構,數據庫的規範化確實有意義,但對於簡單的數據引用,它會使整個想法過於複雜。然後,您將有3個表,產品,類別和引用鏈接,然後您必須在別名表上執行INNER JOIN。 –

+0

它不會工作。你試圖這樣做:'在'(26')'中選擇'2,4,26,33,46',它總是返回0.它只有在catid以'26'開始時纔可以工作。 – Capsule

+0

它會只要該值存在於列中即可。這將選擇catid等於26的任何數據。 –

0

mysql find_in_set()函數將執行此操作。

但是,它永遠不會很快。 Mysql索引對於在字符串中找到匹配沒有用處。它們只在你匹配整個字符串時才起作用,或者從一開始就是一個子字符串。每個查詢都需要全面掃描數據。

如果你不太遠沿發展,可以改變數據模型使用的映射表,看起來像:

create table product_cat (
    rel_id primary key, 
    product_id int, 
    cat_id int, 
    unique (product) product_id, 
    index (cat_product) cat_id, product_id 
) 

然後,把一排表中的每個類別/產品關係,並參與該表。可以快速進行這樣的查詢。

+0

雖然您的評論完全有效,但它可能不會誠然,加入2個表格可以加快少量數據的速度。可能需要一些基準來證實這一點。 – Capsule