MySQL LEFT JOIN - Как обрабатывать случаи, когда записи не совпадают с PHP - PullRequest
0 голосов
/ 20 марта 2020

У меня есть таблица HTML, заполненная записями, возвращенными из MySQL LEFT JOIN.

Это работает, но мне нужно обработать записи, которые не совпадают в JOIN. В настоящее время таблица HTML похожа на приведенную ниже иллюстрацию, и несопоставленные записи unit_outcome находятся в ячейке без соответствующего program_outcome.

+----------------------------------+--------------------------------------------------+
| program_outcome                  |  unit_outcome                                    |
+----------------------------------+--------------------------------------------------+
|                                  | unit_outcome 5, unit_outcome 7                   |
+----------------------------------+--------------------------------------------------+
| program outcome 1                | unit_outcome 2, unit_outcome 4                   |
+----------------------------------+--------------------------------------------------+
| program outcome 2                | unit_outcome 1, unit_outcome 3, unit_outcome 6   |
+----------------------------------+--------------------------------------------------+

Это само по себе нормально, но я хочу добавить в в настоящее время пустая ячейка program_outcome строка типа "Нет соответствующего результата программы". Я хотел бы сделать это в PHP в моем коде, но не уверен, как с этим справиться:

$query = "SELECT MAX(unit.unit_pk) AS unit_pk,
       GROUP_CONCAT(CONCAT('<strong>',unit.unit_code,': </strong>', unit_outcome.unit_outcome) SEPARATOR '|') unit_outcomes,
       MAX(program_outcome.program_outcome) program_outcome,
       GROUP_CONCAT(unit_outcome.unit_outcome_pk) unit_outcome_pks, 
       program_outcome.program_outcome_pk,
       program_outcome.program_outcome
FROM unit
LEFT JOIN unit_unit_outcome_lookup
    ON unit_unit_outcome_lookup.unit_fk = unit.unit_pk
LEFT JOIN unit_outcome
    ON unit_outcome.unit_outcome_pk = unit_unit_outcome_lookup.unit_outcome_fk
LEFT JOIN program_outcome_unit_outcome_lookup
    ON program_outcome_unit_outcome_lookup.unit_outcome_fk = unit_outcome.unit_outcome_pk
LEFT JOIN program_outcome
    ON program_outcome.program_outcome_pk = program_outcome_unit_outcome_lookup.program_outcome_fk
GROUP BY program_outcome_pk ORDER BY cast(program_outcome as unsigned) ASC";

$result = $connection->query( $query );

echo "<table width='100%' border='1'><thead><tr><th>Program Outcomes</th><th>Unit Outcomes</th></tr></thead><tbody>";
while ($row = mysqli_fetch_array($result)) {
echo "<tr><td>" . $row['program_outcome'] . "</td><td>" . str_replace('|', '<p>',$row['unit_outcomes']) . "</td></tr>";
}
echo "<tbody></table>";

1 Ответ

2 голосов
/ 20 марта 2020

Вы можете сделать это в SQL, используя IFNULL().

$query = "SELECT MAX(unit.unit_pk) AS unit_pk,
       GROUP_CONCAT(CONCAT('<strong>',unit.unit_code,': </strong>', unit_outcome.unit_outcome) SEPARATOR '|') unit_outcomes,
       MAX(program_outcome.program_outcome) program_outcome,
       GROUP_CONCAT(unit_outcome.unit_outcome_pk) unit_outcome_pks, 
       program_outcome.program_outcome_pk,
       IFNULL(program_outcome.program_outcome, 'No matching program outcome.') AS program_outcome
FROM unit
LEFT JOIN unit_unit_outcome_lookup
    ON unit_unit_outcome_lookup.unit_fk = unit.unit_pk
LEFT JOIN unit_outcome
    ON unit_outcome.unit_outcome_pk = unit_unit_outcome_lookup.unit_outcome_fk
LEFT JOIN program_outcome_unit_outcome_lookup
    ON program_outcome_unit_outcome_lookup.unit_outcome_fk = unit_outcome.unit_outcome_pk
LEFT JOIN program_outcome
    ON program_outcome.program_outcome_pk = program_outcome_unit_outcome_lookup.program_outcome_fk
GROUP BY program_outcome_pk ORDER BY cast(program_outcome as unsigned) ASC";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...