У меня есть три таблицы: Entries, Institution и Doctors. Вот минимальный пример данных таблицы:
ЗАПИСИ
| keyid | doctorid |
---------------------
| 1 | 23 |
| 2 | 13 |
| 3 | 23 |
| 4 | 13 |
| 5 | 23 |
| 6 | 42 |
| 7 | 5 |
УЧРЕЖДЕНИЕ
| name |
----------
| One |
| Two |
| Three |
| Four |
| Five |
| Six |
ВРАЧИ
| uid | inst |
-----------------------
| 23 | Three |
| 13 | Six |
| 3 | Four |
| 42 | Six |
| 5 | One |
Что мне нужно знать, так это количество записей, которые у меня есть для каждого учреждения. Однако учреждения связаны с записями через таблицу DOCTORS. Итак, результат в этом случае должен дать мне следующее:
РЕЗУЛЬТАТЫ
| name | count |
--------------------
| One | 1 |
| Two | 0 |
| Three | 3 |
| Four | 0 |
| Five | 0 |
| Six | 3 |
Я понятия не имею, как даже начать писать этот запрос. Любая помощь будет принята с благодарностью.
Я уже делал это ранее (ВЫБЕРИТЕ ОТЛИЧНЫЕ i.name, i.uid, r.keyid FROM INSTITUTION AS i, ENTRIES AS r, DOCTORS as d WHERE (i.name = d.inst) AND (d.uid = r .докторид);). Однако я не знаю, как отформатировать это, чтобы получить то, что мне нужно.
Не используйте неявные соединения, используйте явные соединения и читайте агрегатные функции mysql.dev.mysql.com/doc/refman/8.0/en/group-by-functions.html
Все еще боретесь? См. meta.stackoverflow.com/questions/333952/…
Ага. Прости. Я даже не могу начать писать запрос, который, кажется, делает то, что я хочу. Моя единственная попытка была встречена синтаксической ошибкой, которую я не знаю, как исправить, и я на часах. Я действительно не знаю, как даже начать писать запрос, потому что я не знаю, как заставить COUNT считать то, что я хочу. Итак, я сдаюсь. Я просто делаю запрос, который я предоставил, а затем выполняю внешний цикл for, чтобы подсчитать количество результатов.






Это можно решить с помощью агрегированного запроса, который СОЕДИНЯЕТ все три таблицы, например:
SELECT
i.name,
COALESCE(COUNT(e.keyid), 0) cnt
FROM
institution i
LEFT JOIN doctors d ON d.inst = i.name
LEFT JOIN entries e ON e.doctorid = d.uid
GROUP BY i.name
Используя ваши образцы данных, этот демо на DB Fiddle возвращает:
| name | cnt |
| ----- | --- |
| One | 1 |
| Two | 0 |
| Three | 3 |
| Four | 0 |
| Five | 0 |
| Six | 3 |
PS: в зависимости от ваших данных вы можете использовать COUNT(DISTINCT e.keyid).
Я сейчас далеко от компьютера. Но мне пришлось поискать COALESCE. Если я правильно понял, вы использовали его только для возврата 0 для тех учреждений, в которых не было записей. Это правильно?
@aarelovitch: да, это правильно. Без COALESCE у нас были бы значения NULL.
Так что я, наконец, должен попробовать ваш запрос. Это не работает. И, честно говоря, результаты, которые я получил, не имели никакого смысла. Была возвращена одна строка (и должно было быть возвращено около 5). Кроме того, значение cnt было выше, чем количество строк в таблице entres.
@aarelovich: я сделал несколько исправлений в запросе и протестировал его, насколько мне известно, теперь он работает нормально!
СПАСИБО!!! Однако одна маленькая поправка. Я сделал образцы данных. Реальный набор данных был слишком сложен для воспроизведения. Однако запрос по-прежнему дал мне больше результатов, чем было строк в таблице ввода. Именно тогда я понял, что мне нужен DISTINCT в COUNT, чтобы подсчитывать ТОЛЬКО разные записи. Это помогло!!
Начните с присоединения к 3 столам.