对查询进行分组';s的值基于其id组合在一起


group a query's values together based on its id

我有来自数据库的数据,我使用JOIN从不同的表中选择数据,我需要能够根据用户与特定课程相关的特定id将数据分组在一起,由于需要根据选择发送电子邮件,并且在该选择范围内(使用单选按钮),管理员可以通过电子邮件向指定给所选特定类别的所有用户发送

我目前正在获取重复的数据,比如用户的详细信息将显示在每个类别中,而不是在一个单独的类别中传递到数组中以发送电子邮件。我只需要为每个类别/课程选择一个单选按钮,但现在我得到了多个单选按钮。

这是我的问题:

$query="SELECT * FROM course_student
    JOIN course ON course.course_id=course_student.course_id
    JOIN student ON student.student_id=course_student.student_id  
    WHERE course.course_id=course_student.course_id
    ORDER BY course.course_id";

这是我选择数据的循环——它为条目创建重复的名称,我只想用一个名称和中的所有数据

$result=mysqli_query($connection,$query);
confirmation($connection);
while($course_email_students = mysqli_fetch_assoc($result)){
    $course_email = $course_email_students['student_email'];
    $course_name = $course_email_students['course_name'] ."<br/>";

这是我的html:

<input type="radio" name="course_mail[]" value="<?php echo $course_email ;?>">
<?php echo $course_name ?>

<?php } ?>

这是更多的代码html

<form action ="#" method="POST">
<P> <label for="">Send to specific student courses</label>

</p>


<?php  // email specific students

$query = "SELECT student.student_email, course.course_name, course.course_id
FROM course_student
JOIN student ON student.student_id=course_student.student_id  
JOIN course ON course.course_id=course_student.course_id
GROUP BY student.student_email, course.course_id
ORDER BY course.course_id";
$result=mysqli_query($connection,$query);
confirm_query($connection);
 while($course_email_students=mysqli_fetch_assoc($result)){
  $course_student_email=$course_email_students['student_email'];
  $course_student_email_name=$course_email_students['course_name'] ."<br/>";

var_dump($course_email_students['student_email']);

?>  
<input type="radio" name="course_email[]" value="<?php echo $course_student_email ;?>">
<?php echo $course_student_email_name ?>
<P>  <label for="">Message</label>
    <p><textarea rows="10" cols="20" name="message"></textarea></p>
</p>
<input type="submit" name="submit" value="send">

这是用于测试的php

    if(isset($_POST['submit'])){
// do validation

if(isset($_POST['course_email'])){
var_dump($_POST['course_email']);

}


}

从您发布的PHP中,您似乎只是在查询中使用两列,可能是三列的数据。如果是这样,那么在SQL中选择您感兴趣的特定列会更有效率。查询中还有一个冗余,即对WHERE使用与JOIN:中相同的条件

$query="SELECT student.student_email, course.course_name, course.course_id FROM course_student
    JOIN student ON student.student_id=course_student.student_id  
    JOIN course ON course.course_id=course_student.course_id     <-- !!!
             WHERE course.course_id=course_student.course_id     <-- !!!
    ORDER BY course.course_id";

有两种方法可以使用此选择查询来选择结果的唯一组合;您可以使用DISTINCTGROUP BY

区别:

$query = "SELECT DISTINCT student.student_email, course.course_name, course.course_id
    FROM course_student
    JOIN student ON student.student_id=course_student.student_id  
    JOIN course ON course.course_id=course_student.course_id
    ORDER BY course.course_name";

分组依据:

$query = "SELECT student.student_email, course.course_name, course.course_id, student.student_id
    FROM course_student
    JOIN student ON student.student_id=course_student.student_id  
    JOIN course ON course.course_id=course_student.course_id
    GROUP BY student.student_email, course.course_name
    ORDER BY course.course_name";

现在为PHP代码:

$c_name = '';  # course name
$c_id = '';    # course ID
$students = array();
while($aa = mysqli_fetch_assoc($result){
    if ($aa['course_name'] !== $c_name) {
        # the course name has changed. print out the course and student data
        make_radios($c_name, $c_id, $students);
        # set c_name to the new course name
        $c_name = $aa['course.course_name'];
        $c_id = $aa['course.course_id'];
        # set the students to the new student
        $students = array( $aa['student.student_email'] );
    }
    else {
        # add this student to the list of students
        $students[] = $aa['student.student_email'];
    }
}
# print out the last set of data
make_radios( $c_name, $c_id, $students );

function make_radios( $course_name, $course_id, $email_arr ) {
    $html = '<input type="radio" id="email' 
        . $course_id . '" name="course_email[]" value="'
        . implode(',', $email_arr) . '"> <label for="email' 
        . $course_id . '">$course_name</label>';
    # I don't know if you want to list all the email addresses or not... in case you do:
    $html .= "<ul>";
    foreach ($email_arr as $e) {
        $html .= "<li>$e</li>'n";
    }
    $html .= "</ul>";
    # append the message box
    $html .= '<label for="message' . $course_id . '">Message</label>'
        . '<textarea id="message' . $course_id . '" rows="10" cols="20" name="message">'
        . "</textarea>'n";
    echo $html; # or you could return $html
}

我不建议你在表格上有电子邮件地址——我会使用学生ID和学生姓名,然后让你的脚本从数据库中提取合适的电子邮件地址——但这显然取决于你。

请通读代码并检查您是否理解它的作用。我很乐意回答任何问题。

顺序是在英语和SQL术语中都有意义的单词。你说过你希望你的价值观分组。我想你的意思是,用SQL术语来说,你希望它们有序,这样每门课程的学生电子邮件都在一起。

您的查询存在一些问题。

首先,专业提示:避免在软件中使用SELECT *。(当你对数据库进行故障排除时,这是可以的,但这在软件中是浪费和混乱的,尤其是当你对多个表进行JOIN时。)

其次,在JOIN...ONWHERE子句中都重复了这个条件。这是多余的。

course.course_id = course_student.course_id

把它留在你的ON子句和WHERE子句之外。

第三,你的结果集的顺序是欠定的。这可能无关紧要,但您只按课程id排序。如果您关心您的结果集是否通过学生电子邮件排序,请在ORDER BY子句中提及。

第四,你有三张桌子。但其中一个course_student似乎是一个经典的联接表,允许课程和学生之间存在多对多的关系。因此,您可能只有两个表,其中包含实际的应用程序数据项。

最后,从你问题中的代码来看,你似乎想要

course_id
course_name
student_email

SELECT查询生成的结果集中。您的问题的叙述提到了类别,但因为您使用了SELECT *,所以我们无法说出您的意思。

要获得结果集中这三个字段的唯一值,请使用以下查询:

SELECT DISTINCT
       course.course_id,
       course.course_name,
       student.student_email
  FROM course_student
  JOIN course  ON course.course_id=course_student.course_id
  JOIN student ON student.student_id=course_student.student_id  
 ORDER BY course.course_id, student.student_email

DISTINCT限定符可消除重复项。

从你的评论中,仍然很难说你想要什么。但你似乎想试试这个:

SELECT GROUP_CONCAT(DISTINCT course.course_name),
       student.student_email
  FROM course_student
  JOIN course  ON course.course_id=course_student.course_id
  JOIN student ON student.student_id=course_student.student_id  
 GROUP BY student.student_email
 ORDER BY student.student_email

或者你想要这个。

SELECT GROUP_CONCAT(DISTINCT student.student_email),
       course.course_name
  FROM course_student
  JOIN course  ON course.course_id=course_student.course_id
  JOIN student ON student.student_id=course_student.student_id  
 GROUP BY course.course_name
 ORDER BY course.course_name

由于GROUP_CONCAT()的限制,第二个将在你的大型课程中失败。您可能需要编写应用程序代码来逐个课程或逐个学生组织您的网页课程。