2014-09-30 2 views
1

데이터를 데이터베이스에서 가져오고 다른 테이블의 데이터를 선택하기 위해 JOIN을 사용하고 있습니다. 특정 ID를 기반으로 데이터를 그룹화 할 수 있어야합니다. 특정 코스와 관련하여 사용자는 이메일을 선택에 따라 전송해야하며 라디오 버튼을 사용하면 관리자가 선택한 특정 카테고리에 할당 된 모든 사용자에게 이메일을 보낼 수 있습니다.쿼리의 값을 해당 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"; 

: 여기

내 쿼리입니다 여기

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


<?php } ?> 

더 많은 코드입니다 : 여기

$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입니다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"> 

if(isset($_POST['submit'])){ 

// do validation 


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

var_dump($_POST['course_email']); 



} 




} 
+0

@ialarmedalien 나는 그것을 살펴 봤지만 나는 sql/php coulr을 처음 사용하여 예제를 제공합니까? –

+1

[PHP/MySQL at TizTag] (http://www.tizag.com/mysqlTutorial/mysqlgroupby.php)에 대한 유용한 자습서가 있습니다. –

+0

@ialarmedalien 나는 GROUP BY를 사용하여 방금 시도했지만 do/do는 모든 값을 반환하지 않습니다. 하나의 값을 가질 때/특정 코스 내/코스 내에서 –

답변

0

게시 한 PHP에서 검색어에 2 열 3 열의 데이터 만 사용하고있는 것으로 보입니다. 그렇다면 SQL에서 관심있는 특정 열을 선택하는 것이 훨씬 더 효율적입니다. 당신이 JOIN에 가지고 당신이 WHERE에 대해 같은 조건을 사용하는 쿼리의 중복도 있습니다 :

$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 :

$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 
} 

난 당신이 형상 -에 이메일 주소를하는 것이 좋습니다 않을 : PHP 코드에 대한 지금

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

대신 학생 ID와 학생 이름을 사용하고 스크립트에서 적절한 이메일 주소를 가져 오도록하십시오. 그는 데이터베이스를 사용하지만 분명히 당신에게 달렸습니다.

코드를 읽고 내용을 확인하십시오. 질문에 답해 드리겠습니다.

+0

감사합니다 Logged 많은 남자. 하지만 여전히 데이터가 중복되는 경우 특정 코스에 속하는 이메일이 필요합니다. 코스 A는 CourseA에 속한 모든 학생을 포함해야합니다. 여기에 사진이 있습니다 http://tinypic.com/r/kbxi78/8 –

+0

나는 지금 oly 디버깅 오전, 나는 아직 이메일 스크립트를하지 않은, 내가하고있는 모든 일을 확인하고/그 가치를 얻을 수 있습니다 내가 필요로하는 것은 코스 이름마다 하나의 라디오 버튼이 있고 그 코스 내에서 그 코스에 등록 된 특정 학생들입니다. 그래서 그들이 택한 코스를 기반으로 이메일을 보낼 수 있습니다. –

+0

나는 지금까지 가지고있는 모든 코드를 추가했는데 문제는 현재 중복 라디오 버튼과 중복되어있다. –

0

그룹주문를 통해 제공 영어 및 SQL 전문 용어에 모두 의미가있는 단어 어떤 시험보고에 대한 PHP입니다. 당신은 당신의 가치가 그룹화 된 것이라고 말했어. 나는 SQL 용어로, 당신이 그들에게 으로 주문하여 각 과정의 학생 이메일을 함께 보내길 원한다고 생각합니다.

쿼리에 몇 가지 문제가 있습니다.

첫째, 전문가의 팁 : 소프트웨어에서 SELECT *을 사용하지 마십시오. (당신이 데이터베이스 문제를 해결 할 때 그것은 OK,하지만 당신은 하나 개 이상의 테이블을 보내고 JOIN있어 때 특히, 소프트웨어의 낭비와 혼란입니다.)

둘째는,이 조건은 모두 당신 JOIN...ONWHERE 절에 반복했다 . 그것은 불필요한 것입니다.

course.course_id = course_student.course_id 

ON 절에서와 WHERE 절에서 그것을 둡니다.

셋째, 결과 집합의 순서가 미달됩니다. 이것은 중요하지 않을 수 있지만 코스 ID로만 주문하고 있습니다. 결과 세트가 학생 이메일로 주문되었는지 여부에 신경 쓰면 ORDER BY 절에서 언급하십시오.

넷째, 세 개의 테이블이 있습니다. 그러나 그 중 하나 인 course_student은 코스와 학생간에 다 대다 관계가되도록 해주는 고전적인 조인 테이블 인 것으로 보입니다. 따라서 실제 응용 프로그램 데이터 항목이있는 두 개의 테이블 만 가질 가능성이 높습니다.당신이 당신의 SELECT 쿼리에 의해 생성하여 결과 집합에

course_id 
course_name 
student_email 

을 원하는처럼

마지막으로, 문제의 코드에서 보인다. 귀하의 질문에 대한 이야기에는 범주가 언급되어 있지만 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()의 제한 때문에 큰 코스에서 실패 할 것입니다. 과정별로 웹 페이지 코스를 구성하거나 학생이 학생별로 학생 코드를 작성해야 할 수도 있습니다.

+0

나는 아직도 데이터가 중복되어, 특정 코스에 속하는 이메일이 필요합니다. 코스 A는 CourseA에 속하는 모든 학생들을 포함해야합니다. 여기에 그림이 있습니다 tinypic.com/r/kbxi78/8 –

+0

내 답변이 업데이트되었습니다. 이렇게하지 않으면 샘플 입력 데이터와 원하는 출력 데이터를 제공해야합니다. –

+0

그것은 나의 수업과 나는 이것을 몇 시간 동안 알아 내려고 노력해왔다. 난 그냥 라디오 버튼을 중복 싶지 그 라디오 버튼 내에서 학생이 등록되어있는 과정에 대한 학생의 이메일이어야하므로, 나중에 학생은 과정을 기반으로 이메일하실 수 있습니다 –

관련 문제