Объединение таблиц MySQL для отображения количества

#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 ).
  • Я ввел псевдонимы таблиц, поэтому запрос легче писать и читать.