Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/255.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
Php mysql连接重复行,顺序由问题引起_Php_Mysql - Fatal编程技术网

Php mysql连接重复行,顺序由问题引起

Php mysql连接重复行,顺序由问题引起,php,mysql,Php,Mysql,我试着找出每个班级的名字,这个班级的学生和分配给这个班级的科目 在这里,问题是由orderby引起的,我已将orderby分配给student.id 这会导致主题行重复 如果未指定“排序依据”,将按预期获取主题行,这些行不重复,但学生行重复 表格结构 学生 id | Rid | class | name ================================ 1 | 1 | 1 | John 2 | 2 | 1

我试着找出每个班级的名字,这个班级的学生和分配给这个班级的科目

在这里,问题是由
orderby
引起的,我已将
orderby
分配给
student.id

这会导致主题行重复

如果未指定“排序依据”,将按预期获取主题行,这些行不重复,但学生行重复

表格结构

学生

id  |   Rid |   class   |   name
================================
1   |   1   |   1       |   John
2   |   2   |   1       |   Harsita
id  |   title
===============
1   |   science
2   |   math
3   |   english
4   |   social
5   |   hpe
id  |   class   |   subject
===========================
1   |   1       |   1   
2   |   1       |   2
3   |   1       |   3
4   |   1       |   4
课程

id  |   title
==============
1   |   One
2   |   two
3   |   three
主题

id  |   Rid |   class   |   name
================================
1   |   1   |   1       |   John
2   |   2   |   1       |   Harsita
id  |   title
===============
1   |   science
2   |   math
3   |   english
4   |   social
5   |   hpe
id  |   class   |   subject
===========================
1   |   1       |   1   
2   |   1       |   2
3   |   1       |   3
4   |   1       |   4
课程主题

id  |   Rid |   class   |   name
================================
1   |   1   |   1       |   John
2   |   2   |   1       |   Harsita
id  |   title
===============
1   |   science
2   |   math
3   |   english
4   |   social
5   |   hpe
id  |   class   |   subject
===========================
1   |   1       |   1   
2   |   1       |   2
3   |   1       |   3
4   |   1       |   4
要求是

class: One
Science | Math | English | Social | Hpe | 
John | Harsita 
但我得到的

id  |   Rid |   class   |   name
================================
1   |   1   |   1       |   John
2   |   2   |   1       |   Harsita
id  |   title
===============
1   |   science
2   |   math
3   |   english
4   |   social
5   |   hpe
id  |   class   |   subject
===========================
1   |   1       |   1   
2   |   1       |   2
3   |   1       |   3
4   |   1       |   4
如果
ORDER BY
被分配给
student.id

class: One
Science | Math | English | Social | Hpe | Math | English | Social | Hpe | Science | 
John | Harsita |
class: One
Science | Math | English | Social | Hpe | 
John | Harsita | John | Harsita | John | Harsita | John | Harsita | John | Harsita | 
如果未将排序依据分配给学生id

class: One
Science | Math | English | Social | Hpe | Math | English | Social | Hpe | Science | 
John | Harsita |
class: One
Science | Math | English | Social | Hpe | 
John | Harsita | John | Harsita | John | Harsita | John | Harsita | John | Harsita | 
我试过使用
groupby
subject.id
,它只显示一个学生(第一行:John)。问题在哪里?如果不使用
子查询
GROUP\u CONCAT

代码-php和mysql(带订购人)

//mysql查询
挑选
不同的类和主题类,
subject.title作为sub,
student.name作为stdt,
阶级,阶级
从…起
学生
在班级主题上加入班级主题。班级=学生。班级
subject.id=class\u subject.subject上的内部连接主语
class.id=student.class上的内部联接类
哪里
学生。班级=:cid;
//php
$class='';
$stdt='';
$sub='';
$results=Array();
而($row=$result->fetch(PDO::fetch_ASSOC)){
如果($row['class']!=$class){
$class=$row['class'];
echo“Class:.$Class.”
; } 如果($row['sub']!=$sub){ $sub=$row['sub']; echo$sub.“|”; } $results[]=$row; } 回声“
”; foreach($结果为$行){ 如果($row['stdt']!=$stdt){ $stdt=$row['stdt']; echo$stdt.“|”; } }
您的问题是由所有的
连接引起的。有4门课程与1班相关,2名学生。因此,您将在结果中得到4*2=8行。如您所见,联接的结果将是4个科目名中的2组,或2个学生名中的4组。您可以选择在PHP代码中处理此问题,或者因为您在PHP代码中有效地分组,所以在查询中进行分组:

SELECT 
    c.title AS class,
    GROUP_CONCAT(DISTINCT s.title ORDER BY s.title SEPARATOR ' | ') AS subjects,
    GROUP_CONCAT(DISTINCT t.name ORDER BY t.name SEPARATOR ' | ') AS students
FROM class c
JOIN class_subject cs ON cs.class=c.id
JOIN subject s ON s.id=cs.subject
JOIN student t ON c.id=t.class
WHERE c.id=1
GROUP BY class
输出:

class   subjects                            students
One     english | math | science | social   Harsita | John

请注意,您可以在
组内指定
ORDER BY
,以控制组中值的顺序。

您的问题是由所有
连接引起的。有4门课程与1班相关,2名学生。因此,您将在结果中得到4*2=8行。如您所见,联接的结果将是4个科目名中的2组,或2个学生名中的4组。您可以选择在PHP代码中处理此问题,或者因为您在PHP代码中有效地分组,所以在查询中进行分组:

SELECT 
    c.title AS class,
    GROUP_CONCAT(DISTINCT s.title ORDER BY s.title SEPARATOR ' | ') AS subjects,
    GROUP_CONCAT(DISTINCT t.name ORDER BY t.name SEPARATOR ' | ') AS students
FROM class c
JOIN class_subject cs ON cs.class=c.id
JOIN subject s ON s.id=cs.subject
JOIN student t ON c.id=t.class
WHERE c.id=1
GROUP BY class
输出:

class   subjects                            students
One     english | math | science | social   Harsita | John

请注意,您可以在
组中指定一个
ORDER BY
,以控制组中值的顺序。

查看预期结果样本,似乎需要名称和主题的聚合结果

SELECT 
    group_concat( subject.title) AS sub,
    group_concat(student.name) AS stdt,
    class.title AS class
FROM 
    student
INNER JOIN class_subject ON class_subject.class=student.class
INNER JOIN subject ON subject.id=class_subject.subject
INNER JOIN class ON class.id=student.class
WHERE student.class=:cid
group by class.title

使用聚合函数和组,您可以在同一行上显示聚合结果

查看预期结果sampel似乎需要名称和主题的聚合结果

SELECT 
    group_concat( subject.title) AS sub,
    group_concat(student.name) AS stdt,
    class.title AS class
FROM 
    student
INNER JOIN class_subject ON class_subject.class=student.class
INNER JOIN subject ON subject.id=class_subject.subject
INNER JOIN class ON class.id=student.class
WHERE student.class=:cid
group by class.title

使用聚合函数和组,您可以在同一行上显示聚合结果

谢谢您的回答,我想知道,不使用
group\u CONCAT是否可能
。因此,我在问题中使用了单词without
GROUP\u CONCAT
。很抱歉,我错过了问题的这一部分。如果没有
GROUP\u CONCAT
,问题中的样本数据将有8行数据,您必须在PHP代码中处理这些数据。当你在每堂课上增加更多的科目和学生时,情况会变得更糟。唯一的另一种选择是2个查询,一个选择与一个班级相关的所有科目,另一个选择与一个班级相关的所有学生。这就是问题所在,我认为2个查询比
GROUP\u CONCAT
更好,不是吗?因为
GROUP\u CONCAT()
通过逻辑调用GROUP并创建临时表,这可能会对性能造成很大的负面影响,不是吗?我认为
GROUP\u CONCAT
不一定会对性能造成那么大的影响。但这可能是您需要在自己的环境中对其进行基准测试的事情之一。然而,考虑到使用两个简单的查询可以很容易地实现您想要的结果,这可能会更快。感谢您的回答,我想知道,不使用
GROUP\u CONCAT
是否可能。因此,我在问题中使用了单词without
GROUP\u CONCAT
。很抱歉,我错过了问题的这一部分。如果没有
GROUP\u CONCAT
,问题中的样本数据将有8行数据,您必须在PHP代码中处理这些数据。当你在每堂课上增加更多的科目和学生时,情况会变得更糟。唯一的另一种选择是2个查询,一个选择与一个班级相关的所有科目,另一个选择与一个班级相关的所有学生。这就是问题所在,我认为2个查询比
GROUP\u CONCAT
更好,不是吗?因为
GROUP\u CONCAT()
通过逻辑调用GROUP并创建临时表,这可能会对性能造成很大的负面影响,不是吗?我认为
GROUP\u CONCAT
不一定会对性能造成那么大的影响。但这可能是你需要对其进行基准测试的事情之一