在一個表「合作伙伴」,我有一個字段「網站」,可以包含值像1,27,38,12MySQL請求在哪裏...在
然後,在一個網站的ID爲n °27,我想獲得與本網站相關的合作伙伴。
我嘗試這樣做: SELECT * FROM partners WHERE 27 IN (partners.sites)
它的工作原理,如果27是在字符串的開頭(如:27,1,128),但是如果27是在中間它不工作(如:1,27 ,38,12)
你有什麼想法來管理這個嗎?
謝謝。 西里爾
在一個表「合作伙伴」,我有一個字段「網站」,可以包含值像1,27,38,12MySQL請求在哪裏...在
然後,在一個網站的ID爲n °27,我想獲得與本網站相關的合作伙伴。
我嘗試這樣做: SELECT * FROM partners WHERE 27 IN (partners.sites)
它的工作原理,如果27是在字符串的開頭(如:27,1,128),但是如果27是在中間它不工作(如:1,27 ,38,12)
你有什麼想法來管理這個嗎?
謝謝。 西里爾
看到FIND_IN_SET
隱藏的解決方案 – AlexanderMP 2010-08-03 09:58:13
是的,但它完全符合Cyril的要求。就像你指出的那樣,它應該作爲某種關係來實現。 :) – 2010-08-03 10:02:37
@亞歷山大,我承認。這是一個醜陋問題的可怕解決方案。 – ceteras 2010-08-03 10:05:59
手冊這沒有任何意義
爲什麼不 select * from partners where sites=27
?
或者您是否建議sites
是一個包含CSV的varchar? 在這種情況下,從任何角度來看都是完全錯誤的。在數據庫中建立一對多的關係。
假設網站在你查詢同一表中的字段,你可以試試這個:
SELECT * FROM partners WHERE sites LIKE %27;
SELECT * FROM partners WHERE sites LIKE 27;
運作的?
LIKE不僅沒有幫助這種形式,而且它期望27是唯一的字符串(這消除了對LIKE的需要)或最後(爲什麼?) – AlexanderMP 2010-08-03 09:56:50
真,這是一個已經很糟糕的解決方案,已經是一個混亂的問題。我不得不同意創建一對多的多對一關係。 – SimonDowdles 2010-08-03 10:05:25
您可能想要使用FIND_IN_SET()
函數,因爲IN()
函數不會期望以逗號分隔的字符串作爲參數。
這不起作用:
SELECT 27 IN ('1,27,5');
+------------------+
| 27 IN ('1,27,5') |
+------------------+
| 0 |
+------------------+
這工作:
SELECT FIND_IN_SET(27, '1,27,5') > 0;
+-------------------------------+
| FIND_IN_SET(27, '1,27,5') > 0 |
+-------------------------------+
| 1 |
+-------------------------------+
1 row in set (0.00 sec)
+1,暫定。解決手頭的問題,但可以繼續使用非常糟糕的數據庫設計。我認爲真正要做的是擺脫CSV字段,並使用1:n關係表。 – Tomalak 2010-08-03 09:59:57
@Tomalak:是的,我同意。 – 2010-08-03 10:01:49
我將不得不同意在使用的關係將不僅是更好的做法,但將優化您的數據庫請求的速度,以及,即使它不明顯,每一位都很重要。
因此,假設你有所謂的網站一個單獨的表,你可以做一個調用,比如如下:
SELECT * FROM夥伴其中PID IN(SELECT SPID從網站,SITEID = 27);然後
你的關係可能是這樣的:
-------------------------------------
PARTNERS
-------------------------------------
pid | some field |
2 | |
-------------------------------------
-------------------------------------
SITES
-------------------------------------
spid | siteid | surl
2 | 27 | http://...
-------------------------------------
您有一個包含逗號分隔值的字段?爲什麼? – Tomalak 2010-08-03 09:52:53