#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