2013-06-21 39 views
2

我的問題是關於獲取屬性的多個值到一個字符串,而不重複主要行。MySQL查詢連接超過1個相關表

我將用一個簡單的例子,試圖解釋我的問題:

實體 - 關係圖

Diagram

用,例如,下面的數據:

enter image description here

我想要在字段中使用Property_1的串聯來獲取「TABLE」的某些元素,並且可以使用con Property_2在另一個領域中的聯繫。數據庫結構/數據

1 Row1 "P1_1, P1_2" "P2_1, P2_2" 
4 Row4 "P1_3" "P2_3" 

例:

CREATE TABLE table1(
    id INT AUTO_INCREMENT, 
    value VARCHAR(10), 
    PRIMARY KEY(id) 
) ENGINE=INNODB DEFAULT CHARSET=latin1; 

CREATE TABLE property_1(
    id INT AUTO_INCREMENT, 
    value VARCHAR(10), 
    table1 INT, 
    PRIMARY KEY(id), 
    FOREIGN KEY (table1) REFERENCES table1(id) ON UPDATE CASCADE ON DELETE CASCADE 
) ENGINE=INNODB DEFAULT CHARSET=latin1; 

CREATE TABLE property_2(
    id INT AUTO_INCREMENT, 
    value VARCHAR(10), 
    table1 INT, 
    PRIMARY KEY(id), 
    FOREIGN KEY (table1) REFERENCES table1(id) ON UPDATE CASCADE ON DELETE CASCADE 
) ENGINE=INNODB DEFAULT CHARSET=latin1; 
INSERT INTO table1 (value) VALUES 
    ('Row1'),('Row2'),('Row3'),('Row4'),('Row5'),('Row6'); 
INSERT INTO property_1 (value, table1) VALUES 
    ('P1_1', 1), ('P1_2', 1), ('P1_3', 4), ('P1_4', 6); 
INSERT INTO property_2 (value, table1) VALUES 
    ('P2_1', 1), ('P2_2', 1), ('P2_3', 4), ('P2_4', 5); 
但是,它永遠不會複製該得到ROW1和ROW4應該像「TABLE」

例如,查詢行是非常重要的

我已經tryed一些查詢:

SELECT t.*, GROUP_CONCAT(p1.value), GROUP_CONCAT(p2.value) 
FROM table1 t 
    LEFT JOIN property_1 p1 ON p1.table1=t.id 
    LEFT JOIN property_2 p2 ON p2.table1=t.id 
WHERE t.id IN (1,4) 
GROUP BY t.id; 

但結果是在適當的重複值ty_1和property_2字符串。

所以:

如何得到表1的重複行及其屬性的字符串連接起來?

回答

3

快速回答:使用GROUP_CONCAT內DISTINCT - 像這樣:

SELECT t.*, GROUP_CONCAT(distinct p1.value), GROUP_CONCAT(distinct p2.value) 
FROM table1 t 
    LEFT JOIN property_1 p1 ON p1.table1=t.id 
    LEFT JOIN property_2 p2 ON p2.table1=t.id 
WHERE t.id IN (1,4) 
GROUP BY t.id; 

SQLFiddle here

+0

它似乎工作,謝謝你! –

+0

@AdrianMaire:不客氣! –