【问题标题】:Nested for each loop or SQL duplicating results为每个循环或 SQL 复制结果嵌套
【发布时间】:2012-11-13 00:57:15
【问题描述】:

大家好,我在回显我的数据时遇到了问题。 我有三张桌子,一张用于学生、班级和学生班级。 我已经查询了数据库以将这三个人联合起来,这样我就可以看到所有学生,无论他们是否已经参加了班级。 sql是

SELECT students.id, students.student_name, students.student_number,
section_student.ss_id, section_student.section_number,sections.subject 
FROM students 
LEFT JOIN student_classes
ON students.student_number=student_classes.student_number 
LEFT JOIN classes 
ON classes.class_number=student_classes.class_number 
WHERE students.status=1

如果有课程,这会生成一个学生列表。对于那些注册了不止一门课程的学生,名称会在列表中显示两次。

当我 print_r 得到的数据时

Array
(
[0] => stdClass Object
    (
        [class_number] => 
        [student_name] => john smith
        [student_number] => 432100351
        [id] => 2
        [ss_id] => 
        [subject] => 
        [user_email] => john@email.com
        [created_at] => 0000-00-00 00:00:00
        [updated_at] => 0000-00-00 00:00:00
    )

[1] => stdClass Object
    (
        [class_number] => 43223
        [student_name] => Paul jones
        [student_number] => 432100312
        [id] => 3
        [ss_id] => 40
        [subject] => Maths
        [user_email] => Paul@email.com
        [created_at] => 0000-00-00 00:00:00
        [updated_at] => 2012-11-24 08:33:23
    )

[2] => stdClass Object
    (
        [class_number] => 21331
        [student_name] => Paul jones
        [student_number] => 432100312
        [id] => 3
        [ss_id] => 39
        [subject] => Physics
        [user_email] => Paul@email.com
        [created_at] => 0000-00-00 00:00:00
        [updated_at] => 2012-11-24 08:33:23
    )

当我在表格中为每个人做一个以显示学生和他们的班级时,我想循环浏览学生在一行中的班级。例如

约翰 ID:432100351 |不适用 保罗 ID:432100312 | 43223 = 数学,21331 = 物理

当我做我的循环时,我得到了

ID:432100351 约翰 | john@email.com |不适用
ID:432100312 保罗 |保罗@email.com | 43223 = 数学 , 21331 = 物理
ID:432100312 保罗 |保罗@email.com | 43223 = 数学,21331 = 物理

我不确定是我的 sql 还是我的循环问题

这里是代码

@foreach ($students as $student)
<tr>
<td> {{ $key++ }}</td>
<td> {{ HTML::link('students/edit/' .$student->id, $student->student_number) }} </td>
<td> {{ HTML::link('students/edit/' .$student->id, $student->student_name) }} </td>
<td> {{ $student->user_email }} </td>
<td>


    @if(!isset($student->ss_id)) 

        {{ HTML::link('add_student_section.php?student_id='.$student->id,'Add to section'); }}

    @else 

        @foreach($students as $section) 

         {{ HTML::link('edit_student_section.php?ss_id=', $section->section_number . " " . $section->subject . " ") ;}}     

        @endforeach

    @endif    

</td>
<td> {{ date("d-M-Y H:i",strtotime($student->created_at )) }} </td>
<td> 
@if($student->updated_at == $student->created_at)

N/A

@else

{{ date("d-M-Y H:i",strtotime($student->updated_at )) }} 
@endif

</td>
<td> {{ HTML::link('students/delete/' .$student->id, 'Delete Student') }} </td>
</tr>
@endforeach

任何帮助将不胜感激。谢谢

【问题讨论】:

    标签: php mysql foreach laravel


    【解决方案1】:

    您需要将 GROUP BY 与 GROUP_CONCAT 结合使用

    SELECT students.id, students.student_name, students.student_number,GROUP_CONCAT(classes.class_number) as student_classes
    FROM students 
    LEFT JOIN student_classes
    ON students.student_number=student_classes.student_number 
    LEFT JOIN classes 
    ON classes.class_number=student_classes.class_number 
    WHERE students.status=1 GROUP BY students.id
    

    【讨论】:

    • 正在尝试,但不确定如何使用连接实现
    • 我添加了一些代码来展示它必须如何实现。它显示了总体思路 - 显示确切的代码 - 我需要查看表结构。
    • 干杯我设法让 sql 工作。尝试 sql 的好网站 [link]sqlfiddle.com[link]。现在的问题是我如何遍历课程。我在 print_r() [id] => 3 [student_name] => test student [student_number] => 432100312 [email] => ma@ksjdo.c [created_at] => 0000-00-00 00:00 中有这个: 00 [updated_at] => 2012-11-24 08:33:23 [subject_id] => 39,40 [subject] => 数学、物理
    • 您到底需要什么?你可以做 explode(',' $row['subject']) 它将返回主题数组 - 然后你可以循环它们
    • 对不起,我认为它正在工作。我想要做的是把 [subject_id] => 39,40 [subject] => Maths,Physics 拿出来,这样我就可以单独遍历这些,然后我可以将它们用作链接。当我呼应主题时,它会将它们一起打印。谢谢
    【解决方案2】:

    在您的查询中使用distinctgroup by,如下例所示

    SELECT students.id, students.student_name, students.student_number,
    section_student.ss_id, section_student.section_number,sections.subject 
    FROM students 
    LEFT JOIN student_classes
    ON students.student_number=student_classes.student_number 
    LEFT JOIN classes 
    ON classes.class_number=student_classes.class_number 
    WHERE students.status=1 group by students.student_number,sections.subject
    

    【讨论】:

    • 嗨,谢谢,我试过 group by,然后它只显示一个学生很好,但也是一个主题。
    • 那么您还需要two group by 来讨论主题。尝试编辑答案
    猜你喜欢
    • 2013-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-07
    • 2012-04-19
    • 1970-01-01
    • 2018-07-27
    相关资源
    最近更新 更多