如何从一对多到多列的连接中连接三行结果
How to join three row of result from a join one to many to multiple columns
我必须获得一对多连接的前三个结果。
例如
JOIN `company`.`Reason`
ON ((`company`.`Reason`.`quality_id` = `company`.`Quality`.`id`)))
其中 Quality 与 Reason 具有一对多关系。
我需要在列 REASON_1 中显示来自 Reason 的第一个结果,在 REASON_2 中显示第二个,在 REASON_3 中显示第三个。
目前,我只显示一行结果:
`company`.`Reason`.`status` AS `Reason`
我不知道这是怎么回事,它是如何 select 一行,哪一行?
我怎样才能做同样的事情,但只有 3 行和不同的列名?
质量
ID | a | b
1 | a1 | b1
2 | a2 | b2
原因
ID | quality_id | status
1 | quality_id_1 | status_1
2 | quality_id_1 | status_2
2 | quality_id_2 | status_1
2 | quality_id_2 | status_3
所以如果我想得到 id 1 的质量原因,我会得到
REASON_1 | REASON_2 | REASON_3
status_1 | status_2 | null
您需要在原因 table 内创建一个排序,并根据质量中的 id 进行分区,然后将其从您希望 return 中的质量列中移出。在我下面的代码中,我使用变量和子查询来完成此操作,以避免必须对基础 tables.
进行修改
CREATE TABLE Quality (
QualityID INT AUTO_INCREMENT,
Value VARCHAR(50),
PRIMARY KEY(QualityID)
);
CREATE TABLE Reason (
ReasonID INT AUTO_INCREMENT,
QualityID INT,
Status varchar(50),
PRIMARY KEY(ReasonID)
);
INSERT INTO Quality (Value) VALUES ('A1'),('A2');
INSERT INTO Reason (QualityID, Status) VALUES (1,'Test1'),(1,'Test2'),(2,'Test3'),(2,'Test4'),(2,'Test5');
SET @RC = 0;
SET @QC = 0;
SELECT
Q.Value,
MAX(IF(R.OrderNo = 1, R.Status, NULL)) AS Status1,
MAX(IF(R.OrderNo = 2, R.Status, NULL)) AS Status2,
MAX(IF(R.OrderNo = 3, R.Status, NULL)) AS Status3
FROM Quality Q
INNER JOIN (SELECT
@RC:=CASE
WHEN @QC = QualityID THEN @RC + 1
ELSE 1
END AS OrderNo,
@QC:=QualityID as QualityID,
Status
FROM Reason R)R ON R.QualityID = Q.QualityID
GROUP BY Q.Value;
我必须获得一对多连接的前三个结果。 例如
JOIN `company`.`Reason`
ON ((`company`.`Reason`.`quality_id` = `company`.`Quality`.`id`)))
其中 Quality 与 Reason 具有一对多关系。
我需要在列 REASON_1 中显示来自 Reason 的第一个结果,在 REASON_2 中显示第二个,在 REASON_3 中显示第三个。
目前,我只显示一行结果:
`company`.`Reason`.`status` AS `Reason`
我不知道这是怎么回事,它是如何 select 一行,哪一行?
我怎样才能做同样的事情,但只有 3 行和不同的列名?
质量
ID | a | b
1 | a1 | b1
2 | a2 | b2
原因
ID | quality_id | status
1 | quality_id_1 | status_1
2 | quality_id_1 | status_2
2 | quality_id_2 | status_1
2 | quality_id_2 | status_3
所以如果我想得到 id 1 的质量原因,我会得到
REASON_1 | REASON_2 | REASON_3
status_1 | status_2 | null
您需要在原因 table 内创建一个排序,并根据质量中的 id 进行分区,然后将其从您希望 return 中的质量列中移出。在我下面的代码中,我使用变量和子查询来完成此操作,以避免必须对基础 tables.
进行修改CREATE TABLE Quality (
QualityID INT AUTO_INCREMENT,
Value VARCHAR(50),
PRIMARY KEY(QualityID)
);
CREATE TABLE Reason (
ReasonID INT AUTO_INCREMENT,
QualityID INT,
Status varchar(50),
PRIMARY KEY(ReasonID)
);
INSERT INTO Quality (Value) VALUES ('A1'),('A2');
INSERT INTO Reason (QualityID, Status) VALUES (1,'Test1'),(1,'Test2'),(2,'Test3'),(2,'Test4'),(2,'Test5');
SET @RC = 0;
SET @QC = 0;
SELECT
Q.Value,
MAX(IF(R.OrderNo = 1, R.Status, NULL)) AS Status1,
MAX(IF(R.OrderNo = 2, R.Status, NULL)) AS Status2,
MAX(IF(R.OrderNo = 3, R.Status, NULL)) AS Status3
FROM Quality Q
INNER JOIN (SELECT
@RC:=CASE
WHEN @QC = QualityID THEN @RC + 1
ELSE 1
END AS OrderNo,
@QC:=QualityID as QualityID,
Status
FROM Reason R)R ON R.QualityID = Q.QualityID
GROUP BY Q.Value;