我有来自数据库的数据,我使用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']);
}
}
答案 0 :(得分:0)
组和订单是具有英语和SQL术语含义的单词。您已经说过要将您的值分组。我认为您的意思是,在SQL术语中,您希望它们 ordered ,这样每个课程的学生电子邮件都在一起。
您的查询存在一些问题。
首先,专业提示:避免在软件中使用SELECT *
。 (当您对数据库进行故障排除时,这没关系,但它在软件中浪费和混淆,尤其是当您JOIN
多个表格时。“
其次,您在JOIN...ON
和WHERE
条款中都重复了这种情况。那是多余的。
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";
使用此选择查询有两种方法可以选择结果的唯一组合;您可以使用DISTINCT
或GROUP 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和学生的姓名,然后让您的脚本从数据库中提取相应的电子邮件地址 - 但它已经完成了很明显,对你而言。
请仔细阅读代码并检查您是否了解它正在做什么。我很乐意回答任何问题。