2010-04-08 110 views
0

我有一個多選擇下拉的表單。用戶可以在選擇中選擇多個選項。選擇的名稱是array[];使用php我調用implode(",",$array) 在MySQL數據庫中,它將字段存儲爲這種格式的文本"places"= "new york, toronto, london"當我想顯示這些字段時,我將逗號分解。mysql選擇查詢問題

我試圖運行報表來顯示地點。這是我的選擇:

"select * from mytable where db.places .. userSelectedPlaces"

我怎麼能在「地方」名單檢查多倫多用戶選擇?注意數據庫中的「地點」可能只是「多倫多」,或者它可能是逗號分隔的列表,如「紐約,多倫多,倫敦,巴黎等等」。

+0

這可以使用一些代碼格式化... http://stackoverflow.com/editing-help – 2010-04-08 15:44:10

+0

我同意Justin Ethier。但是,如果你不得不查看LOCATE函數http://dev.mysql.com/doc/refman/4.1/en/string-functions.html#function_locate – 2010-04-08 15:50:28

回答

2

如果可能的話,使用另一張桌子來保存用戶選擇的地方會更好。與列調用它SelectedPlaces

  • mytable_id - 要在查詢
  • place加入回表 - EG:「多倫多」

然後你可以運行一個簡單的查詢,如果要弄清楚多倫多已經選定:

SELECT * 
    FROM mytable m 
INNER JOIN SelectedPlaces sp ON sp.mytable_id = m.id 
WHERE sp.place = 'Toronto' 
0

如果我理解正確,你的數據庫設計是錯誤的。嘗試閱讀更多。一般來說,在良好的設計中,您不應該將值列表作爲數據庫中的一個字段,而應該爲其引入新的表格。

但是如果你想這樣做,你可以使用strcmp函數。

+0

設計的原因是這樣的,因爲一個人已經到過好幾個地方了,我們不想把這些地方存放在其他桌子上。注意我使用的是「地點」來取代我的實際目標。 – NULL 2010-04-08 15:49:50

+0

我明白了,但這張桌子是非規範化的,這是一個跡象表明你的設計有問題。根據數據庫設計原則,您應該引入新表來存儲每個用戶訪問的地點。查看Justin Ethier的回答,他描述了這看起來應該如何。 – wlk 2010-04-08 15:53:55

0

如果我理解正確的話,這應該工作:

WHERE DB.PLACES LIKE '%TORONTO%' 

但正如其他用戶所說,它有非規範化表格並不是一件好事。

0

直接回答你的問題,你的查詢需要看起來像這樣

SELECT * 
    FROM mytable 
WHERE places LIKE('%toronto%') 

但是,要知道,像()是緩慢的。

要間接回答你的問題,你的數據庫模式都是錯誤的。這不是做M:N(多對多)關係的正確方法。

想象一下,而不是你有這個

mytable   place     mytable_place    
+------------+ +----------+----------+ +------------+----------+ 
| mytable_id | | place_id | name  | | mytable_id | place_id | 
+------------+ +----------+----------+ +------------+----------+ 
| 1   | | 1  | new york | | 1   | 1  | 
| 2   | | 2  | toronto | | 1   | 2  | 
| 3   | | 3  | london | | 1   | 3  | 
+------------+ +----------+----------+ | 2   | 2  | 
             | 3   | 1  | 
             | 3   | 3  | 
             +------------+----------+ 

mytable_places是所謂的查找表(或外部參照/交叉引用表,或相關表)。它唯一的工作是跟蹤哪些記錄有哪些mytable記錄,反之亦然。

從這個例子我們可以看出,第1 mytable記錄有所有3米的地方,第二個只有多倫多,和第三有紐約倫敦

這也爲您打開了各種各樣的查詢,這些查詢對您當前的設計來說很困難,昂貴或不可能。

想知道有多少mytable記錄有多倫多?沒問題

SELECT COUNT(*) 
    FROM mytable_place x 
    LEFT JOIN place p 
    ON p.place_id = x.place_id 
WHERE p.name = 'toronto'; 

怎麼樣的mytable記錄每個地方的數量,排序?

SELECT p.name 
    , COUNT(*) as `count` 
    FROM mytable_place x 
    LEFT JOIN place p 
    ON p.place_id = x.place_id 
GROUP BY p.place_id 
ORDER BY `count` DESC, p.name ASC 

,這些都是會使用LIKE比任何查詢更快因爲它們可以在諸如place.name列使用索引。