2010-10-05 74 views
0

我正在嘗試創建一個Web索引。在我的數據庫中的每個廣告客戶將能夠出現在幾類,所以我添加了一個categorys列,在該列我將存儲分隔的類別「」所以它看起來像:從MySQL中選擇行

1,3,5 

問題是,我不知道我應該如何選擇某個類別中的所有廣告客戶,例如:mysql_query("SELECT * FROM advertisers WHERE category = ??");

+2

'並在該列中存儲由「,」分隔的類別''將這些歸一化爲單獨的表格會更好。 – 2010-10-05 17:20:11

回答

1

您應該以另一種方式設計數據庫。看看Atomicity
:你不應該以1,3,5的形式存儲你的價值。

我不會給你一個答案,因爲如果你開始使用這種方式現在,你會碰到更嚴重的問題。沒有冒犯:)

3

如果categories是另一個數據庫表,你不應該使用這樣的純文本字段。爲此目的創建一個「數據透視表」,例如advertisers_categories,將兩個錶鏈接在一起。運行安裝程序,你可以做一個查詢,如:

SELECT A.* FROM advertisers AS A 
JOIN advertisers_categories AS AC ON AC.advertiser_id = A.id 
WHERE AC.category_id = 12; 

advertisers_categories的模式會是這個樣子:

# advertisers_categories 
# --> id INT 
# --> advertiser_id INT 
# --> category_id INT 
+1

包括查詢+1(我不記得我的生活如何加入表XD) – stevendesu 2010-10-05 17:26:02

+0

非常感謝你:) – Ben 2010-10-05 18:24:34

+1

@Ben如果你喜歡它,接受答案。 :)從1代表來看,我想你剛從這裏開始。 – BBonifield 2010-10-05 19:33:18

0

你的執行情況,是會讓人很難和服務器的資源徵稅,以做你想做的事。

我建議創建一個表,將廣告客戶關聯到類別,然後在給定類別id值的情況下查詢該表以獲取該類別中的廣告客戶。

0

這是一個非常錯誤的方式來定義類別,因爲你的數組值不能被歸一化。 而是定義另一個名爲CATEGORIES的表,並使用JOIN表將CATEGORIES與ADVERTIZERS匹配。

只有這樣你才能正確選擇它。

希望這會有所幫助!

1

使用逗號分隔的值在SQL查詢中嚴格執行此操作是不可能的。您可以每行返回,並使用一個PHP腳本遍歷每行,使用explode($row,','),然後使用if(in_array($exploded_row,'CATEGORY'))檢查該類別的存在。

更常見的解決方案是重構數據庫。你的想法也是二維的。您正在尋找的Many to Many Data Model

advertisers 
----------- 
id 
name 
etc. 

categories 
---------- 
id 
name 
etc. 

ad_cat 
------ 
advertiser_id 
category_id 

所以ad_cat將至少有一個(通常更多)每廣告主入口和至少一個(通常更多)每類條目,並在ad_cat每一個條目將一個廣告鏈接到一類。

然後,SQL查詢涉及從ad_cat中抓取所需的category_id(s)的每一行,並搜索其id在結果查詢輸出中的廣告商。