Грань возможностей UNION

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


Существуют два основных правила, регламентирующие порядок использования оператора  UNION :

Число и порядок извлекаемых столбцов должны совпадать во всех объединяемых запросах;

Типы данных в соответствующих столбцах должны быть совместимы.


Отсюда вопрос - как выглядит запрос на две таблицы с идентичной структурой, но разными именами столбцов?
Если можно, просто пример, чтоб понять как работает.
Comments (9)
ava
skyboy | 21.03.2013, 09:54 #

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

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

select *
from table1
union
select *
from table2
ava
animegirl | 21.03.2013, 10:04 #
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

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

Запрос должен функционировать так, чтоб юзер задавал поисковое имя, а ему в ответ выдавалось найденное в обоих таблицах. Разбираться книга это или фильм не надо, интересует только совпадение по тексту запроса с именем.
ava
Akina | 21.03.2013, 10:09 #
Цитата (animegirl @  21.3.2013,  10:47 findReferencedText)
понять как работает

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


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.
ava
azesmcar | 21.03.2013, 10:10 #
Цитата (animegirl @  21.3.2013,  10:04 findReferencedText)
Выдаёт только данные из первой таблицы, вторую игнорирует.


Меня терзают смутные сомнения. Может тебе UNION ALL нужен а не UNION?
ava
Akina | 21.03.2013, 10:12 #
Цитата (animegirl @  21.3.2013,  11:04 findReferencedText)
Выдаёт только данные из первой таблицы, вторую игнорирует.

UNION выполняет DISTINCTROW выходного набора. Чтобы получить дублирующиеся записи - используйте UNIOIN ALL.
ava
animegirl | 21.03.2013, 10:22 #
А, всё поняла ошибку, читала про отброс дублирования (Это меня устраивает, так и надо), просто немного протупила по утру.
Теперь вопрос в другом, а как передавать значения?
Вот это вызывает ошибку:

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'
ava
Akina | 21.03.2013, 10:28 #
До объединения результатов выполнения субзапросов они полностью независимы.
Вариант 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%'
ava
animegirl | 21.03.2013, 10:30 #
Akina,
Мне кажется, или первый вариант скушает меньше ресурсов?
ava
Akina | 21.03.2013, 10:33 #
Зависит от селективности отборов. Обычно - да.
Please register or login to write.
Firm of day
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Contributors
advanced
Submit