MySQL - выбор данных из нескольких таблиц с одинаковой структурой, но разными данными - PullRequest
78 голосов
/ 03 января 2009

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

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

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

id, band_name, song_name, album_name, genre

MySQL statment:

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

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

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

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

Ответы [ 6 ]

175 голосов
/ 03 января 2009

Я думаю, что вы ищете предложение UNION , а

(SELECT * from us_music where `genre` = 'punk')
UNION
(SELECT * from de_music where `genre` = 'punk')
19 голосов
/ 03 января 2009

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

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

5 голосов
/ 03 января 2009

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

SELECT * from us_music, de_music where `us_music.genre` = 'punk' AND `de_music.genre` = 'punk'
3 голосов
/ 07 ноября 2009

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

  1. выберите идентификатор
  2. затем выберите основной стол с ним
3 голосов
/ 06 января 2009

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

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

3 голосов
/ 03 января 2009

Столбец неоднозначен, так как он появляется в обеих таблицах, вам необходимо полностью указать поле where (или sort), например, us_music.genre или de_music.genre, но обычно вы указываете две таблицы, если собираетесь присоединиться они вместе каким-то образом. Структуру, с которой вы работаете, иногда называют секционированной таблицей, хотя обычно это делается для разделения набора данных на отдельные файлы, а не для произвольного разделения набора данных. Если вы отвечаете за структуру базы данных и у вас нет веских оснований для разделения данных, я бы построил одну большую таблицу с дополнительным полем «origin», содержащим код страны, но вы, вероятно, делаете это из соображений законной производительности. , Либо используйте объединение для объединения интересующих вас таблиц 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.

...