Объединить две группы данных в один столбец из двух разных таблиц

#php #sql

#php #sql

Вопрос:

В настоящее время я создаю систему учета пациентов для стоматологической клиники. Мне нужно отобразить все процедуры, проведенные пациенту, но у меня есть две таблицы для лечения. Есть ли способ объединить столбцы из двух разных таблиц?

Обе таблицы имеют appointmentid, datecreated, procedure . Я пытался использовать функцию объединения, но когда идентификатор назначения присутствует в обеих таблицах, отображается только первый.

 $sql3 = "SELECT * FROM appointment WHERE patient_number = '".$_GET['patient_number']."'";
$result3 = mysqli_query($conn, $sql3);
    while($row3 = mysqli_fetch_array($result3)) { 

       $sql1 = "SELECT appointment.id, coalesce(alltreatment.datecreated, toothtreatment.datecreated) AS col0 , 
             coalesce(alltreatment.appointmentid, toothtreatment.appointmentid) AS col1, 
             coalesce(alltreatment.procedures, toothtreatment.procedures) AS col3, 
             coalesce(alltreatment.amount, toothtreatment.amount) AS col4
            FROM appointment LEFT JOIN alltreatment ON appointment.id = alltreatment.appointmentid                                               
            LEFT JOIN toothtreatment ON appointment.id = toothtreatment.appointmentid                                            
           WHERE appointment.id = '".$row3['id']."' ORDER BY col1 DESC";

            $result1 = mysqli_query($conn, $sql1);

            while($row1 = mysqli_fetch_array($result1)) {  
                          echo '
                       <tr>  

                            <td>'.$row1['col1'].'</td>
                            <td>'.$row1['col0'].'</td>
                            <td>'.$row1['col3'].'</td>

                       </tr>  
            ';
            }
    }
  

Ожидаемый результат:

 1|2004-12-05|Cleaning (from treatment1)
1|2004-12-05|Tooth Extraction (from treatment2)
  

Комментарии:

1. Подумайте об изменении этой схемы и используйте только одну таблицу для обработки.

2. Мой профессор посоветовал мне иметь разные таблицы из treatment, которые включают только удаление зубов, а другой — весь рот, например, чистку, отбеливание

3. Тогда я надеюсь, что это не профессор, читающий лекции по системам баз данных или вообще по информатике, а, может быть, стоматология или что-то еще…

4. Вы выбираете 4 столбца, тогда как ожидаемый результат имеет 6 столбцов. Предназначено ли это?

5. @clinique сработал ли для вас приведенный ниже ответ? Если да, вы бы приняли это?

Ответ №1:

Попробуйте этот запрос: http://www.sqlfiddle.com /#!18/4dd42/5

 create table appointment (id int)
create table alltreatment (id int, appointmentid int, procedures varchar(50), amount int, datecreated datetime)
create table toothtreatment (id int, appointmentid int, procedures varchar(50), amount int, datecreated datetime)

insert into appointment (id) values (1)
insert into alltreatment (id, appointmentid, procedures, amount, datecreated) values (10, 1, 'Cleaning', 100, '20041205')
insert into toothtreatment (id, appointmentid, procedures, amount, datecreated) values (20, 1, 'Tooth Extraction', 150, '20041205')

SELECT
    appointment.id, 
    alltreatment.datecreated,
    alltreatment.procedures,
    alltreatment.amount
FROM appointment
INNER JOIN alltreatment ON appointment.id = alltreatment.appointmentid 
WHERE appointment.id = 1
UNION ALL
SELECT
    appointment.id, 
    toothtreatment.datecreated,
    toothtreatment.procedures,
    toothtreatment.amount
FROM appointment
INNER JOIN toothtreatment ON appointment.id = toothtreatment.appointmentid 
WHERE appointment.id = 1
ORDER BY appointment.id DESC
  

Это дает следующий результат:

 id  datecreated             procedures          amount
1   2004-12-05T00:00:00Z    Cleaning            100
1   2004-12-05T00:00:00Z    Tooth Extraction    150
  

В качестве альтернативы, следующий запрос дает те же результаты:

 SELECT
    appointment.id, 
    t.datecreated,
    t.procedures,
    t.amount
FROM (
    SELECT
        appointmentid, 
        datecreated,
        procedures,
        amount
    FROM alltreatment
    UNION ALL
    SELECT
        appointmentid, 
        datecreated,
        procedures,
        amount
    FROM toothtreatment 
) t
INNER JOIN appointment ON appointment.id = t.appointmentid 
WHERE appointment.id = 1
ORDER BY appointment.id DESC