我的问题是将属性的多个值放入字符串而不重复主行。
我将使用一个简单的例子来解释我的问题:
实体 - 关系图
例如,有以下数据:
我希望获得“TABLE”的一些元素,其中字段中的Property_1和另一个字段中的Property_2的串联连接。但是,永远不要复制“TABLE”行
是很重要的例如,获取Row1和Row4的查询应如下所示:
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);
我尝试了一些查询:
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;
但结果是复制了property_1和property_2字符串中的值。
所以:
如何获取不同的table1行及其属性在字符串中连接?
答案 0 :(得分: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。