根据其ID将查询的值组合在一起

时间:2014-09-30 16:15:56

标签: php mysql sql mysqli

我有来自数据库的数据,我使用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']);



}




}

2 个答案:

答案 0 :(得分:0)

订单是具有英语和SQL术语含义的单词。您已经说过要将您的值分组。我认为您的意思是,在SQL术语中,您希望它们 ordered ,这样每个课程的学生电子邮件都在一起。

您的查询存在一些问题。

首先,专业提示:避免在软件中使用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()的限制,第二个将在您的大型课程中失败。您可能需要编写应用程序代码来按课程组织您的网页课程,或者由学生编写。

答案 1 :(得分:0)

从您发布的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

DISTINCT:

$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";

GROUP BY:

$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和学生的姓名,然后让您的脚本从数据库中提取相应的电子邮件地址 - 但它已经完成了很明显,对你而言。

请仔细阅读代码并检查您是否了解它正在做什么。我很乐意回答任何问题。