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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Грань возможностей UNION 
V
    Опции темы
animegirl
Дата 21.3.2013, 09:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Незнайка на Марсе
**


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

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



Большинство примеров из интернета, что описывают команду UNION делают это на примерах двух идентичных во всех смыслах таблиц.
Вот цитата из вики:
Цитата

Существуют два основных правила, регламентирующие порядок использования оператора  UNION :
Число и порядок извлекаемых столбцов должны совпадать во всех объединяемых запросах;
Типы данных в соответствующих столбцах должны быть совместимы.

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


--------------------
Скажи миру - НЯ!
PM   Вверх
skyboy
Дата 21.3.2013, 09:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Код

select field1, field2 
from table1
union
select field3, field4
from table2

и дело не в идентичности структуры. одинаковое количество столбцов обязательно только для
Код

select *
from table1
union 
select *
from table2

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


Незнайка на Марсе
**


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

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



skyboy, 
Что-то не выходит как надо, вот таблицы:
Код

CREATE TABLE IF NOT EXISTS `tech_books_names` (
  `book_id` bigint(20) unsigned NOT NULL,
  `book_language` char(2) COLLATE utf8_unicode_ci NOT NULL,
  `book_name` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  PRIMARY KEY (`book_id`,`book_language`),
  KEY `book_id` (`book_id`),
  KEY `book_name` (`book_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

INSERT INTO `tech_books_names` (`book_id`, `book_language`, `book_name`) VALUES
(1, 'de', 'Schießen'),
(1, 'en', 'Shooting'),
(1, 'ru', 'Стрельба');

CREATE TABLE IF NOT EXISTS `tech_films_names` (
  `film_id` bigint(20) unsigned NOT NULL,
  `film_language` char(2) COLLATE utf8_unicode_ci NOT NULL,
  `film_name` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  PRIMARY KEY (`film_id`,`film_language`),
  KEY `film_id` (`film_id`),
  KEY `film_name` (`film_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

INSERT INTO `tech_films_names` (`film_id`, `film_language`, `film_name`) VALUES
(1, 'de', 'Schießen'),
(1, 'en', 'Shooting'),
(1, 'ru', 'Стрельба');

Вот запрос:
Код

select  film_id, film_language , film_name
from  tech_films_names
union
select book_id, book_language, book_name
from  tech_books_names

Выдаёт только данные из первой таблицы, вторую игнорирует.

Запрос должен функционировать так, чтоб юзер задавал поисковое имя, а ему в ответ выдавалось найденное в обоих таблицах. Разбираться книга это или фильм не надо, интересует только совпадение по тексту запроса с именем.


Это сообщение отредактировал(а) animegirl - 21.3.2013, 10:05


--------------------
Скажи миру - НЯ!
PM   Вверх
Akina
Дата 21.3.2013, 10:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(animegirl @  21.3.2013,  10:47 Найти цитируемый пост)
понять как работает

Имена полей берутся из первого субзапроса, имена в остальных - игнорируются. 
Если в субзапросах присутствуют выражения, то имена-алиасы необходимы только в первом.
Например:

Код

SELECT `fio` AS `name`, SUBSTR(`address`, 6) AS `index`, `salary`
FROM `table1`
UNION
SELECT CONCAT_WS(' ',`fam`, `nam`, `otc`), `idx`, `pay`
FROM `table2`

Поля итогового набора будут иметь имена name, index и salary.


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

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


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

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



Цитата(animegirl @  21.3.2013,  10:04 Найти цитируемый пост)
Выдаёт только данные из первой таблицы, вторую игнорирует.

Меня терзают смутные сомнения. Может тебе UNION ALL нужен а не UNION?
PM   Вверх
Akina
Дата 21.3.2013, 10:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(animegirl @  21.3.2013,  11:04 Найти цитируемый пост)
Выдаёт только данные из первой таблицы, вторую игнорирует.

UNION выполняет DISTINCTROW выходного набора. Чтобы получить дублирующиеся записи - используйте UNIOIN ALL.


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

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


Незнайка на Марсе
**


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

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



А, всё поняла ошибку, читала про отброс дублирования (Это меня устраивает, так и надо), просто немного протупила по утру.
Теперь вопрос в другом, а как передавать значения?
Вот это вызывает ошибку:
Код

select  music_id, music_language , music_name
from  tech_musics_names
union
select book_id, book_language, book_name
from  tech_books_names
WHERE music_name LIKE 's%'

#1054 - Unknown column 'music_name' in 'where clause'


--------------------
Скажи миру - НЯ!
PM   Вверх
Akina
Дата 21.3.2013, 10:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



До объединения результатов выполнения субзапросов они полностью независимы.
Вариант 1
Код

select  music_id, music_language , music_name
from  tech_musics_names
WHERE music_name LIKE 's%'
union
select book_id, book_language, book_name
from  tech_books_names
WHERE book_name LIKE 's%'

Вариант 2
Код

Select q.*
From
(
select  music_id, music_language , music_name
from  tech_musics_names
union
select book_id, book_language, book_name
from  tech_books_names
) q
WHERE q.music_name LIKE 's%'



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

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


Незнайка на Марсе
**


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

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



Akina, 
Мне кажется, или первый вариант скушает меньше ресурсов?


--------------------
Скажи миру - НЯ!
PM   Вверх
Akina
Дата 21.3.2013, 10:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Зависит от селективности отборов. Обычно - да.


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

PM MAIL WWW ICQ Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MySQL | Следующая тема »


 




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


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

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