#mysql #sql
#mysql #sql
Вопрос:
Во-первых, я новичок в MySQL и все еще учусь. Я пытаюсь объединить 2 таблицы для отображения количества. В первую очередь я использую 2 кода. Один код для отображения имен —
SELECT tag_logs.timestamp, People.Name FROM `tag_logs` INNER JOIN People WHERE tag_logs.tag_no = People.nametag
Другой код для отображения количества имен —
SELECT tag_logs.tag_no, COUNT(tag_logs.tag_no) FROM tag_logs GROUP BY tag_no HAVING COUNT(tag_no) >= 1
Я хочу отображать имя и номер счета вместо номера тега и количества. Я попытался объединить обе таблицы, используя следующий код, однако мне не повезло —
SELECT People.Name FROM `tag_logs` INNER JOIN People WHERE tag_logs.tag_no = People.nametag AND COUNT(tag_logs.tag_no) FROM tag_logs GROUP BY tag_no HAVING COUNT(tag_no) >= 1
Я получаю сообщение об ошибке, когда я пытаюсь вызвать ‘FROM tag_logs’ во второй раз. Есть ли способ обойти это?
Комментарии:
1. условие соединения неверно
Ответ №1:
Две таблицы соединяются с помощью ON
предложения. Вы должны изучить объединения.
SELECT People.Name ,COUNT(tag_logs.tag_no)
FROM `tag_logs`
INNER JOIN People ON tag_logs.tag_no = People.nametag
GROUP BY tag_logs.tag_no
HAVING COUNT(tag_no) >= 1
Комментарии:
1. @Oloolo . , , Этот запрос содержит более одной проблемы и не является иллюстрацией хорошего способа написания ответа на этот вопрос.
Ответ №2:
Это должно быть
SELECT People.Name FROM `tag_logs`
INNER JOIN People on tag_logs.tag_no = People.nametag
GROUP BY tag_no HAVING COUNT(tag_no) >= 1
Редактировать
SELECT People.Name, COUNT(tag_no) FROM `tag_logs`
INNER JOIN People on tag_logs.tag_no = People.nametag
GROUP BY tag_no HAVING COUNT(tag_no) >= 1
Комментарии:
1. @OloOlo добавил количество
Ответ №3:
Я считаю, что запрос, который вы хотите, выглядит следующим образом:
SELECT p.Name, COUNT(*)
FROM tag_logs tl INNER JOIN
People p
ON tl.tag_no = p.nametag
GROUP BY p.Name;
Примечания:
COUNT(*)
короче, чемCOUNT(tl.tag_no)
и они делают то же самое.GROUP BY
предложение теперь соответствуетSELECT
. Если у вас могут быть люди с одинаковыми именами, затем добавьтеp.nametag
вGROUP BY
. Версия, используемая толькоGROUP BY tl.tag_no
для недопустимого SQL, должна завершиться ошибкой в большинстве баз данных из-за несоответствияp.Name
вSELECT
.HAVING
Предложение (HAVING COUNT(tag_no) >= 1
) не нужно, потомуINNER JOIN
что требуется хотя бы одно совпадение иtag_no
никогдаNULL
не выполняется (потому что оно используется дляJOIN
).- Я ввел псевдонимы таблиц, поэтому запрос легче писать и читать.