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