Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.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_Sql View - Fatal编程技术网

Mysql 如何将三行结果从一列联接到多列联接到多列

Mysql 如何将三行结果从一列联接到多列联接到多列,mysql,sql,sql-view,Mysql,Sql,Sql View,我必须先得到一对多连接的三个结果。 比如说 JOIN `company`.`Reason` ON ((`company`.`Reason`.`quality_id` = `company`.`Quality`.`id`))) 质量与理性有一对多的关系 我需要在列REASON_1中显示REASON的第一个结果,在REASON_2中显示REASON_2,在REASON_3中显示REASON_3 目前,我仅以这种方式显示一行结果: `company`.`Reason`.`status`

我必须先得到一对多连接的三个结果。 比如说

JOIN `company`.`Reason`
  ON ((`company`.`Reason`.`quality_id` = `company`.`Quality`.`id`)))
质量与理性有一对多的关系

我需要在列REASON_1中显示REASON的第一个结果,在REASON_2中显示REASON_2,在REASON_3中显示REASON_3

目前,我仅以这种方式显示一行结果:

  `company`.`Reason`.`status`                                                AS `Reason`
我不知道它是如何工作的,它如何选择一行,以及哪一行?
我怎样才能做到同样的效果,但只能使用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

您需要在由id from quality分区的原因表中创建一个排序,然后在希望返回的columns from quality上进行数据透视。在下面的代码中,我使用变量和子查询完成了这项工作,以避免对基表进行修改

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;

最好包含有关您正在查询的数据结构的更多信息,以便我们提供更好的帮助。您是否尝试过对按原因排序的列进行行号排序,并返回前三个结果?是什么决定了哪一行最终位于原因1、原因2、原因3-您是否有某种排序列?@Bridge Nothing,我只需要将表Reason的“status”列放在Reason_1、2和3中。感谢您的完整回答,但我不使用SQL Server,我使用mysql,而且我认为这里没有“pivot”::您的解决方案需要简单得多,然后您能在您的Reason表中存储状态的顺序吗?不幸的是,我不能,我没有取消修改它们的权限。我已经修改了代码,所以它现在应该可以在mysql中工作,但原则是一样的。希望这对你有用。非常感谢你尝试帮助我!我试图使它适应我的数据库结构,但我得到了一个错误,我不能在sql视图中使用变量。很抱歉在我的帖子中提到它,我只是贴了个标签。