2011-01-12 53 views
0

我正在處理一個小項目,涉及抓取每個組存儲的聯繫人列表。基本上,數據庫的設置使每個組都有一個主要和次要聯繫人存儲爲Group.Primary和Group.Secondary。目標是爲每個組拉取每個主要和次要聯繫人並將其顯示在可排序的表中。MySQL查詢哪裏列像列

我有排序表都解決了,但我已經遇到了一個小問題。每個主要和輔助字段可以有多個聯繫人,並用逗號分隔。舉例來說,如果主要包含123256,那就需要拉兩個觸點與編號123和256。我本來打算使用格式化這樣的查詢:

SELECT * 
    FROM Group G, 
     Contacts C 
WHERE G.Primary LIKE %C.ID% 
    OR G.Secondary LIKE %C.ID% 

,這樣我可以只跳過逗號的一部分,但我似乎無法找到一個工作查詢。

我對你的問題是,我只是忽視的東西嗎?有沒有簡單的查詢可以讓我這樣做?或者,我最好分開獲得團隊和聯繫人,然後再將兩者結合起來。我認爲前者在閱讀時容易理解,這是一個加分,因爲這是一個共享項目,但如果這是不可能的,我會做後者。

這段代碼被簡化了,但它得到了重點。

+0

你在數據庫中有一對多的關係。一個組有一個或多個聯繫人。大多數人通過添加一個包含groupid和contact id組合的額外表格來解決這個問題。通過這種方式,您可以使用常規聯接來獲取與該組關聯的所有聯繫人。增加的好處是它比每次用逗號分隔值「解析」字符串要快得多。 – Gerben 2011-01-12 18:47:39

+0

不幸的是,這是一個遺留數據庫,太多的系統依靠它來改變結構,所以它必須保持原樣。我會在這裏嘗試解決方案,看看我能做些什麼。 – shmeeps 2011-01-12 19:35:17

回答

3

如果我理解正確的話,你要使用的MySQL FIND_IN_SET function

SELECT * 
    FROM Group G 
    JOIN Contacts C ON FIND_IN_SET(c.id, g.primary) 
        OR FIND_IN_SET(c.id, g.secondary) 

但我強烈建議您規範化表 - 不要以逗號分隔的列表,如果在所有可能的。

+0

這個伎倆,非常感謝你! – shmeeps 2011-01-12 19:41:34

0

我想你肯定是最好的兩個數據值分成不同的表,然後使用JOIN s到做你的鏈接。比如說,如果你將自己的ID字段轉換爲字符串,以便使用LIKE比較,那麼最終會得到一堆垃圾匹配。例如,如果你的主ID爲1,您的輔助是35,那麼你會匹配以下的(這名單並不詳盡):

1: 1, 2: 35 
1: 35, 2: 1 
1: 10, 2: 135 
1: 431, 2: 3541 

我會這樣做是這樣的:

SELECT * 
FROM Group G 
LEFT JOIN Contacts c1 on g.primary = c1.id 
LEFT JOIN Contacts c2 on g.secondary = c2.id 
WHERE 
c1.id IS NOT NULL 
OR 
c2.id IS NOT NULL 

我認爲,如果我正確地理解了這個問題,你會得到你真正需要的數據。

0

撒旦已在數據庫中,非規範化它,你惜敗到複雜,查詢速度慢的生活。

你有能力改變數據庫的結構嗎?如果它在生產中,我認爲不是。否則,您可能需要考慮在運行此報告之前立即創建主要和次要聯繫人的標準化表。

如果你不能做到這一點,你需要制定出一個字符串匹配算法,將始終工作。您提出的問題是,您需要考慮23(甚至3)的聯繫人ID,該ID將匹配23,123,223,231等等。爲了做到這一點,你需要在你正在比較的兩個字符串的開頭和結尾添加逗號,然後執行LIKE。

糟糕。或者你可以使用上面Ponies所描述的我從來不知道的FIND_IN_SET函數。