Модераторы: skyboy

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Выборка и сортировка 2 таблиц 
:(
    Опции темы
alafin
Дата 6.3.2008, 20:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 124
Регистрация: 12.4.2006

Репутация: нет
Всего: 2



Нужно сделать выборку из 2 однотипных таблиц(party1, party2) и отсортировать записи по полю name.
Структура таблиц такая
CREATE TABLE `party1` (
`ID` int(10) NOT NULL auto_increment,
`name` varchar(255) character set latin1 collate latin1_german2_ci NOT NULL,
`location` int(10) NOT NULL,
`deleted` int(2) NOT NULL default '0',
PRIMARY KEY (`ID`),
KEY `name` (`name`),
FULLTEXT KEY `name_2` (`name`)
) ENGINE=MyISAM

Сделал такой запрос, но он что-то не помогает
(SELECT * FROM party1 WHERE deleted = '0') UNION (SELECT * FROM party2 WHERE deleted = '0') ORDER BY name ASC

Подскажите в чем может быть дело.
--------------------
                              http://python.com.ua
PM MAIL   Вверх
Akina
Дата 6.3.2008, 21:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



Код

Select *
From 
(
  (
    SELECT * 
    FROM party1 
    WHERE deleted = '0'
  ) 
  UNION 
  (
    SELECT * 
    FROM party2 
    WHERE deleted = '0'
  ) 
ORDER BY name ASC


Добавлено через 1 минуту и 4 секунды
PS. Скорее всего, в подзапросе придется в обоих частях UNION указать вместо звездочки имена выбираемых полей поштучно.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
alafin
Дата 7.3.2008, 09:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 124
Регистрация: 12.4.2006

Репутация: нет
Всего: 2



При таком запросе phpMyAdmin выдает следующую ошибку:
#1248 - Every derived table must have its own alias 

Как быть в таком случае?
--------------------
                              http://python.com.ua
PM MAIL   Вверх
Akina
Дата 7.3.2008, 09:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



Цитата(alafin @  7.3.2008,  10:21 Найти цитируемый пост)
Как быть в таком случае? 

Блин, ну сделай ты то что он просит.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
SharedNoob
Дата 7.3.2008, 10:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 25.6.2007
Где: UA

Репутация: нет
Всего: 5



а я бы еще к UNION  добавил ALL во имя избежания группировки записей smile
PM MAIL ICQ Skype   Вверх
skyboy
Дата 7.3.2008, 11:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 41
Всего: 260



Цитата(alafin @  7.3.2008,  08:21 Найти цитируемый пост)
Every derived table must have its own alias 

каждая таблица(в смысле - одна и та же таблица, входящая в запрос в разных ролях) должна иметь собственный псевдоним.
псевдоним задается через оператор as(как для таблиц, так и для полей):
Код

SELECT my_column as name, my_column2 as surname
FROM my_table as your_table

PM MAIL   Вверх
Akina
Дата 7.3.2008, 12:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



В данном случае парсер не может понять, какой из deleted нужен. Т.е. заменить их на partyX.deleted. 


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
alafin
Дата 7.3.2008, 21:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 124
Регистрация: 12.4.2006

Репутация: нет
Всего: 2



Пробую так 
Select *
From 
(
  (
    SELECT ID AS ID1, name AS name1, location AS location1, deleted AS deleted1
    FROM party1 
    WHERE deleted1 = '0'
  ) 
  UNION ALL
  (
    SELECT ID AS ID2, name AS name2, location AS location2, deleted AS  deleted2 
    FROM party2 
    WHERE deleted2 = '0'
  ) 
)
ORDER BY name ASC

Но ошибка таже.
--------------------
                              http://python.com.ua
PM MAIL   Вверх
SelenIT
Дата 7.3.2008, 23:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


баг форума
****


Профиль
Группа: Завсегдатай
Сообщений: 3996
Регистрация: 17.10.2006
Где: Pale Blue Dot

Репутация: 6
Всего: 401



Зачем вообще две таблицы, если одни однотипные? Не проще ли объединить в одну и добавить различительное поле?

Вообще по мануалу самый первый запрос должен работать, а вариант Akinы, при всем уважении, кажется мне искусственным и избыточным. alafin, какую ошибку выдавал самый первый вариант?


--------------------
Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму!
PM MAIL   Вверх
alafin
Дата 7.3.2008, 23:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 124
Регистрация: 12.4.2006

Репутация: нет
Всего: 2



Первый запрос выдавал следующую ошибку:
#1271 - Illegal mix of collations for operation 'UNION' 
--------------------
                              http://python.com.ua
PM MAIL   Вверх
SelenIT
Дата 7.3.2008, 23:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


баг форума
****


Профиль
Группа: Завсегдатай
Сообщений: 3996
Регистрация: 17.10.2006
Где: Pale Blue Dot

Репутация: 6
Всего: 401



А у таблиц разные кодировки?


--------------------
Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму!
PM MAIL   Вверх
Akina
Дата 7.3.2008, 23:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



Код

Select *
From 
(
  (
    SELECT * 
    FROM party1 
    WHERE party1.deleted = '0'
  ) 
  UNION 
  (
    SELECT * 
    FROM party2 
    WHERE party2.deleted = '0'
  ) 
)
ORDER BY name ASC
Это тоже не работает? А если ORDER BY 2 ?

Цитата(SelenIT @  8.3.2008,  00:03 Найти цитируемый пост)
Вообще по мануалу самый первый запрос должен работать, а вариант Akinы, при всем уважении, кажется мне искусственным и избыточным.

Для 5-й версии - да. Но версии мы до сих пор не знаем. А раз на исходном запросе проблема возникла - то вряд ли пятерка.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
alafin
Дата 8.3.2008, 07:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 124
Регистрация: 12.4.2006

Репутация: нет
Всего: 2



Цитата(Akina @  7.3.2008,  23:28 Найти цитируемый пост)
Select *
From 
(
  (
    SELECT * 
    FROM party1 
    WHERE party1.deleted = '0'
  ) 
  UNION 
  (
    SELECT * 
    FROM party2 
    WHERE party2.deleted = '0'
  ) 
)
ORDER BY name ASC
Это тоже не работает? А если ORDER BY 2 ?


В таком случае тоже выдает ошибку 
#1248 - Every derived table must have its own alias

Добавлено через 56 секунд
У таблиц одинаковые кодировки
--------------------
                              http://python.com.ua
PM MAIL   Вверх
skyboy
Дата 8.3.2008, 09:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 41
Всего: 260



alafin, прости, ввел в заблуждение  smile 
ошибка значит "каждая вложенная таблица". т.е. у тебя во FROM сейчас просто в скобках подзапрос. безымянный. но он должен иметь свой псевдоним.
вроде такого:
Код

Select *
From 
(
  (
    SELECT * 
    FROM party1 
    WHERE party1.deleted = '0'
  ) 
  UNION 
  (
    SELECT * 
    FROM party2 
    WHERE party2.deleted = '0'
  ) 
) as partY_cummuliative
ORDER BY name ASC
Это тоже не работает? А если ORDER BY 2 ?

PM MAIL   Вверх
alafin
Дата 8.3.2008, 10:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 124
Регистрация: 12.4.2006

Репутация: нет
Всего: 2



skyboy, и так тоже не работает пишет 
#1271 - Illegal mix of collations for operation 'UNION' 
Пробую на разных версиях MySQL:
MySQL: 4.1.21
MySQL 5.0.45

--------------------
                              http://python.com.ua
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MySQL | Следующая тема »


 




[ Время генерации скрипта: 0.1323 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.