#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
aPRIMARY 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 ...