Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
连接多个相关表的MySQL查询_Mysql_Sql - Fatal编程技术网

连接多个相关表的MySQL查询

连接多个相关表的MySQL查询,mysql,sql,Mysql,Sql,我的问题是如何在不复制主行的情况下将属性的多个值放入字符串中 我将用一个简单的例子来解释我的问题: 实体关系图 例如,使用以下数据: 我想得到“TABLE”的一些元素,在一个字段中包含属性_1,在另一个字段中包含属性_2。但是,决不能重复“表”的行,这一点很重要 例如,获取第1行和第4行的查询应如下所示: 1 Row1 "P1_1, P1_2" "P2_1, P2_2" 4 Row4 "P1_3" "P2_3" 数据库结构/数据示例: CREATE TABLE table1( id

我的问题是如何在不复制主行的情况下将属性的多个值放入字符串中

我将用一个简单的例子来解释我的问题:

实体关系图

例如,使用以下数据:

我想得到“TABLE”的一些元素,在一个字段中包含属性_1,在另一个字段中包含属性_2。但是,决不能重复“表”的行,这一点很重要

例如,获取第1行和第4行的查询应如下所示:

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;
但结果是复制属性_1和属性_2字符串中的值

因此:


如何获取表1中的不同行,并将其属性串接在字符串中?快速回答:在您的组中使用distinct\u concat-如下所示:

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