MySQL – выбор данных из нескольких таблиц с одинаковой структурой, но с разными данными

StackOverflow https://stackoverflow.com/questions/409705

Вопрос

Хорошо, вот моя дилемма. У меня есть база данных, содержащая около 5 таблиц с одинаковой структурой данных.Данные разделяются таким образом в целях локализации и для разделения в общей сложности около 4,5 миллионов записей.

В большинстве случаев требуется только одна таблица, и все в порядке.Однако иногда необходимы данные из двух или более таблиц, и их необходимо отсортировать по определенному пользователем столбцу.Вот здесь у меня и возникают проблемы.

столбцы данных:

id, band_name, song_name, album_name, genre

Заявление MySQL:

SELECT * from us_music, de_music where `genre` = 'punk'

MySQL выдает эту ошибку:

#1052 - Column 'genre' in where clause is ambiguous

Очевидно, я делаю это неправильно.Кто-нибудь хочет пролить свет на это для меня?

Это было полезно?

Решение

Я думаю, ты ищешь СОЮЗ пункт, а-ля

(SELECT * from us_music where `genre` = 'punk')
UNION
(SELECT * from de_music where `genre` = 'punk')

Другие советы

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

Добавьте новый столбец, который можно использовать для различения пяти языков (я предполагаю, что это язык, который различается в таблицах, поскольку вы сказали, что он предназначен для локализации).Не беспокойтесь о наличии 4,5 миллионов записей.Любая реальная база данных без проблем справится с таким размером.Добавьте правильные индексы, и вам не составит труда работать с ними как с одной таблицей.

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

SELECT * from us_music, de_music where `us_music.genre` = 'punk' AND `de_music.genre` = 'punk'

Столбец неоднозначен, поскольку он появляется в обеих таблицах. Вам нужно будет полностью указать полеwhere (или сортировки), например us_music.genre или de_music.genre, но обычно вы указываете две таблицы, если затем собираетесь объединить их вместе в какая-то мода.Структуру, с которой вы имеете дело, иногда называют секционированной таблицей, хотя обычно это делается для разделения набора данных на отдельные файлы, а не просто для произвольного разделения набора данных.Если вы отвечаете за структуру базы данных и нет веской причины разделять данные, я бы создал одну большую таблицу с дополнительным полем «источник», содержащим код страны, но вы, вероятно, делаете это из законных соображений производительности. .Либо используйте объединение для объединения интересующих вас таблиц. http://dev.mysql.com/doc/refman/5.0/en/union.html или с помощью механизма базы данных Merge http://dev.mysql.com/doc/refman/5.1/en/merge-storage-engine.html.

Ваша первоначальная попытка охватить обе таблицы создает неявное соединение.Это не одобряется большинством опытных программистов SQL, поскольку при этом таблицы, подлежащие объединению, разделяются по условию того, как это сделать.

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

А union утверждение приводит к увеличению времени обработки огромных данных.Хорошо выполнять выбор в 2 этапа:

  1. выберите идентификатор
  2. затем выберите с ней основную таблицу
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top