2012-12-02 53 views
2

我有2表,項目和成員:MySQL查詢獲得逗號分隔的IDS數據的詳細

CREATE TABLE IF NOT EXISTS `items` (
`id` int(5) NOT NULL AUTO_INCREMENT, 
`name` varchar(255) NOT NULL, 
`member` varchar(255) NOT NULL, 
PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

CREATE TABLE IF NOT EXISTS `members` (
    `id` int(5) NOT NULL AUTO_INCREMENT, 
    `name` varchar(255) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

如果,例如我有內部items的記錄,如

INSERT INTO `test`.`items` (
`id` , 
`name` , 
`member` 
) 
VALUES (
NULL , 'xxxx', '1, 2, 3' 
); 

members

INSERT INTO `members` (`id`, `name`) VALUES 
(1, 'asdf'), 
(2, 'qwert'), 
(3, 'uiop'), 
(4, 'jkl;'); 

和我想要顯示items.member數據與members.name,類似於1#asdf, 2#qwert, 3#uiop ??

我試過下面的查詢,

SELECT items.id, items.name, GROUP_CONCAT(CONCAT_WS('#', members.id, members.name)) as member 

FROM `items` 
LEFT JOIN members AS members on (members.id = items.member) 
WHERE items.id = 1 

但結果並不像我想象的。是否有任何其他方式通過一個呼叫查詢顯示數據?因爲我正在使用PHP,現在,我將爆炸items.member並逐一循環,以顯示members.name

+0

你能告訴我們你的'物品表'嗎? – bonCodigo

+0

你可以改變數據庫的模式嗎? – kmkaplan

+0

@bonCodigo my'items'表只包含一條記錄,如上面 – thom

回答

3

你可以考慮使用你的加入標準FIND_IN_SET()

FROM items JOIN members ON FIND_IN_SET(members.id, items.member) 

但是,請注意從FIND_IN_SET()定義:

字符串列表是通過分離子組成的字符串「, 「字符。

因此items.member列不應包含任何空格(我想你可以使用FIND_IN_SET(members.id, REPLACE(items.member, ' ', '')) - 但是這將是爲你的數據庫的增長非常昂貴)。

真的,你應該normalise架構:

CREATE TABLE memberItems (
    item_id INT(5) NOT NULL, 
    member_id INT(5) NOT NULL, 
    FOREIGN KEY item_id REFERENCES items (id), 
    FOREIGN KEY member_id REFERENCES members (id) 
); 

INSERT INTO memberItems 
    (item_id, member_id) 
SELECT items.id, members.id 
FROM items 
    JOIN members ON FIND_IN_SET(members.id, REPLACE(items.member,' ','')) 
; 

ALTER TABLE items DROP member; 

這既是指數型(因此可以非常高效地查詢),並已在數據庫實施參照完整性。 然後,你可以這樣做:

FROM items JOIN memberItems ON memberItems.item_id = items.id 
      JOIN members  ON members.id = memberItems.member_id 

還請注意,這是一般不明智使用GROUP_CONCAT()到單獨的記錄,以這種方式合併爲一個字符串:你的應用程序應該改爲在結果集準備循環獲取每個成員。

+0

謝謝你的回答。事實上,正常的數據庫應該像'memberItems'。但是,因爲這是不正常的,所以我試圖找到一種方法來使這件事情發生。僅供參考,實際上我有1k條'物品',如果我必須拆分它,需要一些時間。我會加深參考。 – thom

+0

@ thom:參見上面的我的編輯,它顯示了您現有數據中'memberItems'的自動填充。 – eggyal

+0

然後它現在正常:)謝謝你的幫助 – thom

0

請看看這個例子:

SQLFIDDLE

您的查詢似乎對你在問題中提到什麼工作... :)

SELECT I.ID, I.ITEM, 
GROUP_CONCAT(CONCAT("#",M.ID, 
M.NAME, " ")) AS MEMB 

FROM ITEMS AS I 
LEFT JOIN MEMBERS AS M 
ON M.ID = I.MID 
WHERE i.id = 1 
; 

EDITTED ANSWER 此查詢不適用於您,因爲您的架構似乎沒有任何完整性或適當的引用。再加上你的美女ID由一個逗號分隔,這在這個答案中被忽略了。

+0

你的sqlfiddle中的'items'表與完全不同於問題中給出的表,它有一個'member'列包含一個字符串(顯然)是由逗號分隔的成員ID ... – eggyal

+0

@eggyal +1爲你的。當我指出他將成員ID添加到項目中作爲逗號分隔的字符串時,我驚訝地發現它......我只適用於正常化情況... – bonCodigo