MySQL – выбор данных из нескольких таблиц с одинаковой структурой, но с разными данными
-
03-07-2019 - |
Вопрос
Хорошо, вот моя дилемма. У меня есть база данных, содержащая около 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 этапа:
- выберите идентификатор
- затем выберите с ней основную таблицу