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

Хорошо, вот моя дилемма. У меня есть база данных, состоящая из 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

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

Ответ 1

Я думаю, что вы ищете UNION, a la

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

Ответ 2

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

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

Ответ 3

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

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

Ответ 4

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

Ответ 5

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

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

Ответ 6

Оператор union вызывает время транзакции в огромных данных. Хорошо выполнить выбор в 2 этапа:

  • выберите id
  • затем выберите основную таблицу с ней