SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 10.03.2010 15:07:30

AvtoNom
Завсегдатай
Зарегистрирован: 20.11.2008
Сообщений: 33

ORDER и "Column in order clause is ambiguous", "Duplicate column name"

Есть две почти одинаковых базы:


CREATE TABLE IF NOT EXISTS `news` (
  `news_id` int(6) NOT NULL auto_increment,
  `status` int(1) default '0',
  `news_inv_id` int(6) default NULL,
  PRIMARY KEY  (`news_id`)
) ENGINE=MyISAM

CREATE TABLE IF NOT EXISTS `news_inv` (
  `news_inv_id` int(6) NOT NULL auto_increment,
  `status` int(1) default '0',
  `news_id` int(6) default NULL,
  PRIMARY KEY  (`news_inv_id`)
) ENGINE=MyISAM
 


В запросах используется перекрытие полей.
Первый запрос на сортировку проходит  нормально.

SELECT `news`. * ,
COALESCE( (ISNULL( `news_inv`.`status` ) || `news_inv`.`status` =1 ) , 0) AS `status`
FROM `news`
LEFT JOIN `news_inv` ON `news`.`news_id` = `news_inv`.`news_id`
ORDER BY `status` ASC
 

Но вот второй вы дает ошибку "#1052 - Column 'news_inv_id' in order clause is ambiguous"

SELECT `news` . * ,
`news`.`news_id` AS `news_inv_id`
FROM `news`
order by news_inv_id
 


хотя по сути в обоих запросах возвращается два поля с одинаковым именем.

Что я хочу? Мне нужно сделать сортировку по результату SELECT вне зависимости к какой таблице принадлежит поле т.е. к news_inv или news или даже COALESCE.

Пробовал обвернуть весь результат в SELECT но тот выдает "#1060 - Duplicate column name 'news_inv_id'"


Похоже я здесь надолго
=8-D

Неактивен

 

#2 10.03.2010 15:24:11

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: ORDER и "Column in order clause is ambiguous", "Duplicate column name"

1. Как-то Вы странно пользуетесь COALESCE() — он уже сам по себе нужен для
того, чтобы проверять на NULL.

2. Попробуйте мысленно представить себе следующую ситуацию. У Вас есть две
корзины яблок — «красные» и «зеленые».
  а. Первая задачка — выбирать по одному яблоку из каждой корзины и приклеить
на каждое из них бирочку «яблоко».
  б. Вторая задачка — выбирать по одному яблоку из каждой корзины и приклеивать
на каждое бирочку «яблоко», а потом разложить пары в порядке возрастания
размера того, что подписано, как «яблоко».

Очевидно, что «а» Вы решите легко, а при решении «б» у Вас возникнет когнитивный
диссонанс — Вы можете сортировать или по размеру красных яблок или по размеру
зеленых. А вот по размеру абстрактных яблок — не можете. Так же и MySQL: пока
Вы явно не скажете, по размеру каких яблок ему сортировать, он будет отказываться
это делать (что не мешает ему выдавать и то, и другое за яблоки, пока Вы не пыта-
етесь устраивать сортировки).

Добивайтесь уникальности названий колонки (например, через AS) или явно указывайте,
по колонке какой таблицы нужно сортировать.

Неактивен

 

#3 10.03.2010 15:36:00

AvtoNom
Завсегдатай
Зарегистрирован: 20.11.2008
Сообщений: 33

Re: ORDER и "Column in order clause is ambiguous", "Duplicate column name"

paulus написал:

Так же и MySQL: пока
Вы явно не скажете, по размеру каких яблок ему сортировать, он будет отказываться
это делать

почему тогда работает первый запрос?


Похоже я здесь надолго
=8-D

Неактивен

 

#4 10.03.2010 16:03:48

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: ORDER и "Column in order clause is ambiguous", "Duplicate column name"

Потому что колонка status уникальна.

Неактивен

 

#5 10.03.2010 16:11:42

AvtoNom
Завсегдатай
Зарегистрирован: 20.11.2008
Сообщений: 33

Re: ORDER и "Column in order clause is ambiguous", "Duplicate column name"

AvtoNom написал:


CREATE TABLE IF NOT EXISTS `news` (..
  `status` int(1) default '0', ....


SELECT `news`. * , .... AS `status`
 

как видно не уникальна wink


Похоже я здесь надолго
=8-D

Неактивен

 

#6 10.03.2010 17:33:08

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: ORDER и "Column in order clause is ambiguous", "Duplicate column name"

Одна называется `news`.`status`, вторая `status`. Какая по Вашему больше похожа
на `status`? wink

Неактивен

 

#7 10.03.2010 17:45:01

AvtoNom
Завсегдатай
Зарегистрирован: 20.11.2008
Сообщений: 33

Re: ORDER и "Column in order clause is ambiguous", "Duplicate column name"

AvtoNom написал:

Есть две почти одинаковых базы:


CREATE TABLE IF NOT EXISTS `news` (...
  `news_inv_id` int(6) default NULL, ...


SELECT `news` . * ,
`news`.`news_id` AS `news_inv_id`
FROM `news`
order by news_inv_id
 

в чём тогда отличие этого от предыдущего?
то же `news`.`news_inv_id` и `news_inv_id`


Похоже я здесь надолго
=8-D

Неактивен

 

#8 10.03.2010 18:08:31

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: ORDER и "Column in order clause is ambiguous", "Duplicate column name"

Хм, и правда… ну, в любом случае, я бы на месте MySQL и на первый вариант
обиделся smile

Пишите изначально без допущения неоднозначности, тогда всё будет хорошо.

Неактивен

 

#9 10.03.2010 18:24:40

AvtoNom
Завсегдатай
Зарегистрирован: 20.11.2008
Сообщений: 33

Re: ORDER и "Column in order clause is ambiguous", "Duplicate column name"

хорошо. тогда как посоветуешь сделать сортировку? в идеале я думаю мне нужно получить результат выборки который уже был бы не привязан к какой ниб таблице и его сортировать.
Просто я заранее не знаю по полю какой таблице пользователь захочет отсортировать данные.


Похоже я здесь надолго
=8-D

Неактивен

 

#10 10.03.2010 19:58:31

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: ORDER и "Column in order clause is ambiguous", "Duplicate column name"

ORDER BY 1. Будет сортировать по первой колонке.

Неактивен

 

#11 11.03.2010 15:48:37

AvtoNom
Завсегдатай
Зарегистрирован: 20.11.2008
Сообщений: 33

Re: ORDER и "Column in order clause is ambiguous", "Duplicate column name"

paulus написал:

ORDER BY 1. Будет сортировать по первой колонке.

мягко говоря, не универсально.


Похоже я здесь надолго
=8-D

Неактивен

 

#12 11.03.2010 18:15:00

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: ORDER и "Column in order clause is ambiguous", "Duplicate column name"

Придумайте универсальный способ выбора столбца в таком запросе:
SELECT a, b as a FROM tablename ORDER BY a;

Как только придумаете — это и будет универсальным ответом на Ваш вопрос.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson