MySQL: Как СЧИТАТЬ наборы данных на основе наибольшего номера ревизии? - PullRequest
0 голосов
/ 22 февраля 2019

Отдельные записи в моей базе данных MySQL 5.7 позволяют пересматривать их через PHP: таким образом, уже сохраненные наборы записей данных могут быть актуализированы.Для каждой отдельной актуализации, которая представляет собой не что иное, как сохранение одной и той же записи данных, установленной n раз, автоматически устанавливается номер редакции (он начинается с 0):

+----+-----------+-----------+-------------------+----------+
| ID | PatientID | SurgeryID | blahblahblah      | revision |
+----+-----------+-----------+-------------------+----------+
| 1  | 8883      | 7493      | Appendectomy      | 0        |
| 2  | 8883      | 7493      | Appendectomy      | 1        |
| 3  | 8883      | 7493      | Lap. Appendectomy | 2        |
+----+-----------+-----------+-------------------+----------+

Набор записей данных, который меня интересуетКонечно, это тот, у которого наибольшее число, так как это последняя редакция:

+----+-----------+-----------+-------------------+----------+
| ID | PatientID | SurgeryID | blahblahblah      | revision |
+----+-----------+-----------+-------------------+----------+
| 3  | 8883      | 7493      | Lap. Appendectomy | 2        |
+----+-----------+-----------+-------------------+----------+

(Пожалуйста, обратите внимание, что термины бла-бла заменены числами (см. ниже), я только что назвал их здесь длячтобы лучше увидеть проблему.)

Как я могу СЧИТАТЬ эти отфильтрованные наборы записей данных?

Выполнено до сих пор:

Код запроса SQL для фильтрации данных с наибольшей ревизиейнабор записей выглядит следующим образом:

SELECT DISTINCT p.ID, p.PatientID, op.PatID, op.SurgeryID, op.blahblahblah, op.revision
FROM patient_table p
LEFT OUTER JOIN surgery_table op ON op.PatID = p.PatientID
WHERE some restrictions
AND p.PatientID = op.PatID  -- possibly redundant
AND NOT EXISTS (SELECT 1
                  FROM surgery_table op2
                  WHERE op2.PatID = p.PatientID AND op2.revision > op.revision
                 );

Этот код запроса SQL работает нормально и дает правильные результаты.

Теперь я хочу СЧИТАТЬ только различные выполненные формы операций.Мой код SQL-запроса до сих пор выглядит следующим образом:

SELECT COUNT(IF(op.blahblahblah = '0',1,NULL)) 'No Nurgery',
       COUNT(IF(op.blahblahblah = '1',1,NULL)) 'Appendectomy',
       COUNT(IF(op.blahblahblah = '2',1,NULL)) 'Lap. Appendectomy',
       [... lots of surgical procedures listed here ...],
       COUNT(IF(op.blahblahblah = '50',1,NULL)) 'Colostomy',
       COUNT(IF(op.blahblahblah = '99',1,NULL)) 'Different Surgery'
FROM surgery_table op
WHERE op.SurgeryDate BETWEEN "2000-01-01" AND "2020-12-31"

Это, конечно, обеспечивает ВСЕ наборы записей данных независимо от их номеров редакций:

+-------------------+-----------------------------------------------------+
| blahblahblah      | COUNTs of blahblahblah / no latest revision numbers |
+-------------------+-----------------------------------------------------+
| Appendectomy      | 34579                                               |
| Lap Appendectomy  | 23475                                               |
| ...               | ...                                                 |
| Colostomy         | 3547                                                |
| Different Surgery | 49558                                               |
+-------------------+-----------------------------------------------------+

Как объединить или объединитьили какой-то первый и второй SQL-запрос к COUNT просто записи данных с наибольшим номером ревизии?

В результате я хочу получить таблицу, подобную этой:

+-------------------+-----------------------------------------------------+
| blahblahblah      | COUNTs of blahblahblah / latest revision numbers    |
+-------------------+-----------------------------------------------------+
| Appendectomy      | 3854                                                |
| Lap Appendectomy  | 1473                                                |
| ...               | ...                                                 |
| Colostomy         | 563                                                 |
| Different Surgery | 2534                                                |
+-------------------+-----------------------------------------------------+

Ответы [ 3 ]

0 голосов
/ 22 февраля 2019

Ваш второй запрос извлекает одну строку с множеством столбцов (по одному для каждой обработки).Ваш ожидаемый результат показывает одну строку на обработку вместо этого, что мне нравится намного лучше.

В вашей базе данных, похоже, отсутствует таблица процедур.Создайте:

+--------------+-------------------+
|treatment_id  | description       |
+--------------+-------------------+
| 1            | Appendectomy      |
| 2            | Lap. Appendectomy |
+--------------+-------------------+

С вашей таблицей хирургии

+----+-----------+-----------+--------------+----------+
| ID | PatientID | SurgeryID | treatment_id | revision |
+----+-----------+-----------+--------------+----------+
| 1  | 8883      | 7493      | 1            | 0        |
| 2  | 8883      | 7493      | 1            | 1        |
| 3  | 8883      | 7493      | 2            | 2        |
+----+-----------+-----------+--------------+----------+

вы можете использовать что-то вроде:

select t.treatment, t.description, count(s.id)
from treatment t
left join surgery_table s using(treatment_id)
where (s.patientid, s.revision) in
(
  select patientid, max(revision)
  from surgery_table
  where surgerydate between date '2000-01-01' and date '2020-12-31'
  group by patientid
)
group by treatment_id
order by treatment_id;
0 голосов
/ 22 февраля 2019

В запросе вы используете предложение FROM (включая все объединения), чтобы указать, откуда вы хотите получить данные, и предложение WHERE, какие из данных выбрать.

Так что если вы хотите работатьна тех же данных, затем замените ваше предложение FROM и WHERE.Т.е. удалите

FROM surgery_table op
WHERE op.SurgeryDate BETWEEN "2000-01-01" AND "2020-12-31"

из вашего второго запроса и замените его на

FROM patient_table p
LEFT OUTER JOIN surgery_table op ON op.PatID = p.PatientID
WHERE some restrictions
AND p.PatientID = op.PatID  -- possibly redundant
AND NOT EXISTS (SELECT 1
                  FROM surgery_table op2
                  WHERE op2.PatID = p.PatientID AND op2.revision > op.revision
                 );

Альтернативой является выбор из запроса:

select blahblahblah, count(*)
from (  <your first query here>  ) q
group by blahblahblah;
0 голосов
/ 22 февраля 2019

Последняя запись операции на пациента может быть легко получена с помощью агрегации:

select *
from surgery_table
where (patientid, revision) in
(
  select patientid, max(revision)
  from surgery_table
  where surgerydate between date '2000-01-01' and date '2020-12-31'
  group by patientid
);

И, конечно, вы можете агрегировать эти записи:

select
  sum(blahblahblah = 0) as no_surgery,
  sum(blahblahblah = 1) as lap_appendectomy,
  ...
from surgery_table
where (patientid, revision) in
(
  select patientid, max(revision)
  from surgery_table
  where surgerydate between date '2000-01-01' and date '2020-12-31'
  group by patientid
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...