2017-01-06 7 views
0

Привет это мой запрос из этого запроса я получаю 3 записи я хочу только одну запись и я пытаюсь группе studentidКак группы по колонке с forloop и объединения всех

foreach ($gdFinaldata['gdskill'] as $skillId => $skillScore){ 

$filterQuery .= $union_all. "SELECT stu.student_pid 

FROM tbl_students stu LEFT JOIN r_job_invitations jbi ON stu.student_email = jbi.email 

LEFT JOIN r_job_scores jsc ON jsc.student_id = stu.student_pid 

WHERE job_id = ".$jobID." AND skill_id = ".$skillId." AND gd_score >= ".$skillScore." "; 

$union_all=" UNION ALL "; 

} //for ends here 

в recodrs будет приходят так:

SELECT stu.student_pid FROM tbl_students stu LEFT JOIN r_job_invitations jbi ON stu.student_email = jbi.email LEFT JOIN r_job_scores jsc ON jsc.student_id = stu.student_pid WHERE job_id = 88 AND skill_id = 3 AND gd_score >= 1 
UNION ALL 
SELECT stu.student_pid FROM tbl_students stu LEFT JOIN r_job_invitations jbi ON stu.student_email = jbi.email LEFT JOIN r_job_scores jsc ON jsc.student_id = stu.student_pid WHERE job_id = 88 AND skill_id = 63 AND gd_score >= 2 
UNION ALL 
SELECT stu.student_pid FROM tbl_students stu LEFT JOIN r_job_invitations jbi ON stu.student_email = jbi.email LEFT JOIN r_job_scores jsc ON jsc.student_id = stu.student_pid WHERE job_id = 88 AND skill_id = 128 AND gd_score >= 3 

После этого я хочу, чтобы добавить группу, как я могу это сделать я пытался так:

$groupby = "GROUP BY student_id"; 
$filterStudents = $conn->query($filterQuery.$groupby); 

Мой вопрос все еще возвращаются 3 записи я хочу, чтобы группировать студентом

Справочно: enter image description here

ответ

1

Есть несколько способов сделать это.

  • Используйте union вместо union all, это сохранит только уникальные записи

    select ... 
    union 
    select ... 
    union 
    select ... 
    
  • Если вы хотите сохранить union all (почему вы?), Используйте круглые скобки вокруг выбирает и добавить group by после него

    select student_pid 
    (select student_pid, student_id from ... 
    union all 
    select student_pid, student_id from ... 
    union all 
    select student_pid, student_id from ...) as t 
    group by student_id 
    

    Ваш PHP будет выглядеть

    foreach (...) { 
        $filterQuery .= $union_all. "SELECT stu.student_pid, jsc.student_id ..." 
        // ... 
    } 
    
    $outerQuery = "select student_pid (" 
    $groupby = ") as t GROUP BY student_id"; 
    $filterStudents = $conn->query($outerQuery . $filterQuery . $groupby); 
    
  • Вместо group by вы также можете использовать distinct, например.

    select distinct student_pid 
    (select student_pid from ... 
    union all 
    select student_pid from ... 
    union all 
    select student_pid from ...) as t 
    
  • Collect результат в массиве, а затем использовать array_unique Хотя это является наименее эффективным, так как он извлекает все записи вместо соответствующих частей.

+0

Да, ваш запрос должен быть. SELECT * FROM (выберите ... объединение выберите ... союз выбрать ...), как grptable группы по grptable.student_pid –

+0

что-то упущено пытается отладки .. спасибо за вашу помощь надеюсь, что это работает. –

+0

Возможно, дополнительный столбец во внутреннем запросе ($ filterQuery), см. Обновленный ответ. –

 Смежные вопросы

  • Нет связанных вопросов^_^