Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.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,此查询的结果是否能够在不相乘的情况下联接 Select StudID, StudName, StudYear from tbl_students where StudYear='Third Year'; Select StudID, StudName, StudYear from tbl_students where StudYear='Second Year'; Select StudID, StudName, StudYear from tbl_students where StudYear

此查询的结果是否能够在不相乘的情况下联接

Select StudID, StudName, StudYear from tbl_students where StudYear='Third Year';
Select StudID, StudName, StudYear from tbl_students where StudYear='Second Year';
Select StudID, StudName, StudYear from tbl_students where StudYear='First Year';
或者,这些查询的“结果”是否可能与第三年的前3列、第二年的第二3列和第一年的最后3列的9列联接。 谢谢你善意的回答

因此,我的想法是这样的

StudentID | StudentName | StudentYear ----------------------------------------- 1 | foo1 | 1 ----------------------------------------- 2 | foo2 | 1 ----------------------------------------- 3 | foo3 | 2 ----------------------------------------- 4 | foo4 | 2 ----------------------------------------- 5 | foo5 | 2 ----------------------------------------- 6 | foo6 | 3 ----------------------------------------- StudentID | StudentName | StudentYear ----------------------------------------- 1 | foo1 | 1 ----------------------------------------- 2 | foo2 | 1 ----------------------------------------- 3 | foo3 | 2 ----------------------------------------- 4 | foo4 | 2 ----------------------------------------- 5 | foo5 | 2 ----------------------------------------- 6 | foo6 | 3 ----------------------------------------- StudentID-1 | StudentName-1 | StudentYear-1 | StudentID-2 | StudentYear-2 | StudentID-3 | StudentYear-3 ---------------------------------------------------------------------------------------------------------------------------------------------------- 1 | foo1 | 1 | 3 | foo3 | 2 | 6 | foo6 | 3 ---------------------------------------------------------------------------------------------------------------------------------------------------- 2 | foo2 | 1 | 4 | foo4 | 2 | | | ---------------------------------------------------------------------------------------------------------------------------------------------------- || | 5 | foo5 | 2 | | | ----------------------------------------------------------------------------------------------------------------------------------------------------
是的,您可以将这些查询作为

SELECT * FROM
  (Select StudentID, StudentName, StudentYear as Third_StudYear
     from Students
     where StudentYear=3) y3
  CROSS JOIN (Select StudentID, StudentName, StudentYear as Second_StudYear
                from Students
                where StudentYear=2) y2
  CROSS JOIN (Select StudentID, StudentName, StudentYear as First_StudYear
                from Students
                where StudentYear=1) y1
如果那是你真正想做的


祝您好运。

是的,您可以将这些查询作为

SELECT * FROM
  (Select StudentID, StudentName, StudentYear as Third_StudYear
     from Students
     where StudentYear=3) y3
  CROSS JOIN (Select StudentID, StudentName, StudentYear as Second_StudYear
                from Students
                where StudentYear=2) y2
  CROSS JOIN (Select StudentID, StudentName, StudentYear as First_StudYear
                from Students
                where StudentYear=1) y1
如果那是你真正想做的


祝您好运。

Ok将我的答案更改为使用子查询,并将每个子查询视为具有自己的别名列的表。这不会产生您想要的确切结果。这将在未填充的其他6列中产生空值。话虽如此,我相信这差不多就是你在查询中想要做的事情

SELECT StudentFirst.*, StudentSecond.*, StudentThird.*
FROM (((tbl_students ts 
left join (SELECT StudID AS StudIDFirst, StudName AS StudNameFirst, StudYear AS StudYearFirst FROM tbl_students WHERE StudYear = 'First Year') AS StudentFirst on (ts.StudID = StudentFirst.StudIDFirst))
left join (SELECT StudID AS StudIDSecond, StudName AS StudNameSecond, StudYear AS StudYearSecond FROM tbl_students WHERE StudYear = 'Second Year') AS StudentSecond on (ts.StudID = StudentSecond.StudIDSecond))
left join (SELECT StudID AS StudIDThird, StudName AS StudNameThird, StudYear AS StudYearThird FROM tbl_students WHERE StudYear ='Third Year') AS StudentThird on (ts.StudID = StudentThird.StudIDThird))
下面是查询的结果


我会说我不推荐这种方法。MySQL在处理子查询方面已经有了很大的进步,但是5.5之前的任何东西都会有糟糕的性能,即使是5.5,一旦达到了一定的数据水平,也不会很好。同时,使用mysql语句格式化结果也不是一个好主意。如果您需要以某种方式查看结果,我将检索记录集,然后将它们以该格式放在应用程序前端。我希望这会有所帮助。

Ok将我的答案更改为使用子查询,并将每个子查询视为一个具有自己的别名列的表。这不会产生您想要的确切结果。这将在未填充的其他6列中产生空值。话虽如此,我相信这差不多就是你在查询中想要做的事情

SELECT StudentFirst.*, StudentSecond.*, StudentThird.*
FROM (((tbl_students ts 
left join (SELECT StudID AS StudIDFirst, StudName AS StudNameFirst, StudYear AS StudYearFirst FROM tbl_students WHERE StudYear = 'First Year') AS StudentFirst on (ts.StudID = StudentFirst.StudIDFirst))
left join (SELECT StudID AS StudIDSecond, StudName AS StudNameSecond, StudYear AS StudYearSecond FROM tbl_students WHERE StudYear = 'Second Year') AS StudentSecond on (ts.StudID = StudentSecond.StudIDSecond))
left join (SELECT StudID AS StudIDThird, StudName AS StudNameThird, StudYear AS StudYearThird FROM tbl_students WHERE StudYear ='Third Year') AS StudentThird on (ts.StudID = StudentThird.StudIDThird))
下面是查询的结果


我会说我不推荐这种方法。MySQL在处理子查询方面已经有了很大的进步,但是5.5之前的任何东西都会有糟糕的性能,即使是5.5,一旦达到了一定的数据水平,也不会很好。同时,使用mysql语句格式化结果也不是一个好主意。如果您需要以某种方式查看结果,我将检索记录集,然后将它们以该格式放在应用程序前端。我希望这会有帮助。

为了达到您的要求,您必须有某种id类型的东西才能加入,所以使用了行号,否则您将获得一对多对多的结果

在SQL Server中工作。所以在MYSQL中尝试一下

CREATE TABLE #STUDENT(ID INT, NAME VARCHAR(10), STUDENT_YEAR INT);
INSERT INTO #STUDENT VALUES(1,'FOO1',1);
INSERT INTO #STUDENT VALUES(2,'FOO2',1);
INSERT INTO #STUDENT VALUES(3,'FOO3',2);
INSERT INTO #STUDENT VALUES(4,'FOO4',2);
INSERT INTO #STUDENT VALUES(5,'FOO5',2);
INSERT INTO #STUDENT VALUES(6,'FOO6',3);


SELECT * FROM (
    SELECT 
        ROW_NUMBER() OVER (ORDER BY S1.ID ASC) RN,
        S1.ID AS [ID_1], S1.NAME AS [NAME_1],S1.STUDENT_YEAR AS [YEAR_1]  
    FROM #STUDENT S1
    where s1.STUDENT_YEAR=1
) T1    
FULL JOIN (
    SELECT 
        ROW_NUMBER() OVER (ORDER BY S2.ID ASC) RN,
        S2.ID AS [ID_2], S2.NAME AS [NAME_2],S2.STUDENT_YEAR AS [YEAR_2]  
    FROM #STUDENT S2
    where s2.STUDENT_YEAR=2
) T2 ON T1.RN = T2.RN
FULL JOIN (
    SELECT 
        ROW_NUMBER() OVER (ORDER BY S3.ID ASC) RN,
        S3.ID AS [ID_3], S3.NAME AS [NAME_3],S3.STUDENT_YEAR AS [YEAR_3]  
    FROM #STUDENT S3
    where s3.STUDENT_YEAR=3
) T3 ON T1.RN = T3.RN
注意
#Student
表示它是一个临时表


要达到您的要求,您必须有某种id类型的东西才能加入,因此使用行号,否则您将获得一对多对多的结果

在SQL Server中工作。所以在MYSQL中尝试一下

CREATE TABLE #STUDENT(ID INT, NAME VARCHAR(10), STUDENT_YEAR INT);
INSERT INTO #STUDENT VALUES(1,'FOO1',1);
INSERT INTO #STUDENT VALUES(2,'FOO2',1);
INSERT INTO #STUDENT VALUES(3,'FOO3',2);
INSERT INTO #STUDENT VALUES(4,'FOO4',2);
INSERT INTO #STUDENT VALUES(5,'FOO5',2);
INSERT INTO #STUDENT VALUES(6,'FOO6',3);


SELECT * FROM (
    SELECT 
        ROW_NUMBER() OVER (ORDER BY S1.ID ASC) RN,
        S1.ID AS [ID_1], S1.NAME AS [NAME_1],S1.STUDENT_YEAR AS [YEAR_1]  
    FROM #STUDENT S1
    where s1.STUDENT_YEAR=1
) T1    
FULL JOIN (
    SELECT 
        ROW_NUMBER() OVER (ORDER BY S2.ID ASC) RN,
        S2.ID AS [ID_2], S2.NAME AS [NAME_2],S2.STUDENT_YEAR AS [YEAR_2]  
    FROM #STUDENT S2
    where s2.STUDENT_YEAR=2
) T2 ON T1.RN = T2.RN
FULL JOIN (
    SELECT 
        ROW_NUMBER() OVER (ORDER BY S3.ID ASC) RN,
        S3.ID AS [ID_3], S3.NAME AS [NAME_3],S3.STUDENT_YEAR AS [YEAR_3]  
    FROM #STUDENT S3
    where s3.STUDENT_YEAR=3
) T3 ON T1.RN = T3.RN
注意
#Student
表示它是一个临时表


您想要什么结果?每行代表什么?它不能代表一个学生。既然不能,就不清楚是什么把一年级学生和二年级和三年级学生绑在一起。您是否正试图使用它在特定布局中生成一个表(每年一组列,每年有独立的行)?如果是这样,我建议在应用程序逻辑中这样做,而不是在您的查询中。我建议将此问题移至。可能会帮助您更新您的问题,并告诉我们您是如何得出所显示的结果的。实际上,原始表中的行与结果表中的行之间的关系似乎是随机的。谢谢。你想要什么结果?每行代表什么?它不能代表一个学生。既然不能,就不清楚是什么把一年级学生和二年级和三年级学生绑在一起。您是否正试图使用它在特定布局中生成一个表(每年一组列,每年有独立的行)?如果是这样,我建议在应用程序逻辑中这样做,而不是在您的查询中。我建议将此问题移至。可能会帮助您更新您的问题,并告诉我们您是如何得出所显示的结果的。因为这是关系