#1060 — Дубликат имени столбца ‘id’

#mysql #database-replication

#mysql #sql #mysql-ошибка-1060

Вопрос:

Почему я получаю #1060 — дубликат имени столбца ‘id’

 SELECT COUNT(*) FROM (SELECT * FROM `tips` `t` LEFT JOIN
tip_usage ON tip_usage.tip_id=t.id GROUP BY t.id) sq
  

Комментарии:

1. Знаете ли вы, что, поскольку это ЛЕВОЕ соединение, строки в объединенной таблице не влияют на количество строк, возвращаемых COUNT(*) ? С таким же успехом вы могли бы сделать SELECT COUNT(*) FROM tips

2. Нет! Подождите!… есть ГРУППА ПО… но нет функции агрегирования… этот запрос просто не имеет смысла.

3. Включен ли id a PRIMARY KEY tips ? Если у вас нет записи для подсказки tip_usage , следует ли учитывать эту подсказку?

4. @Mchl: это то же COUNT(DISTINCT) самое, что и . Это могло бы иметь смысл, если бы были дубликаты t.id .

5. Если вам нужно COUNT(DISTINCT ..) , вы COUNT(DISTINCT ..) не используете какой-то трюк, который может работать или не работать в зависимости от установленного режима SQL. dev.mysql.com/doc/refman/5.5/en /…

Ответ №1:

Вероятно, потому, что * in select * выбирает два столбца с одинаковым именем из tip_usage и tips .

Комментарии:

1. … и «все столбцы в списке выбора подзапроса должны иметь уникальные имена».

Ответ №2:

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

 SELECT COUNT(*) FROM (SELECT t.id FROM `tips` `t` 
LEFT JOIN tip_usage ON tip_usage.tip_id=t.id 
GROUP BY t.id) sq 
  

Ответ №3:

Ваш запрос эквивалентен этому:

 SELECT  COUNT(DISTINCT id)
FROM    tips
  

, нет необходимости в объединении.

Вы уверены, что не хотите INNER JOIN вместо?

Ответ №4:

У меня была та же проблема, переименование в предложение select спасло меня

 SELECT people.id, vehicle.id ...
  

Я переименовал его с помощью ключевого слова AS

 SELECT people.id AS person_id, vehicle.id ...