Хорошо, вот моя дилемма. У меня есть база данных, состоящая примерно из 5 таблиц с одинаковой структурой данных. Данные разделяются таким образом для целей локализации и разбивают в общей сложности около 4,5 миллионов записей.
В большинстве случаев нужен только один стол, и все в порядке. Однако иногда требуются данные из 2 или более таблиц, и их нужно отсортировать по столбцу, заданному пользователем. Вот где у меня проблемы.
столбцы данных:
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
Очевидно, я делаю это неправильно. Кто-нибудь хочет пролить свет на это для меня?
sql
mysql
join
mysql-error-1052
Джейрокс
источник
источник
SELECT
, например:(SELECT 'us_music' AS from_table, * FROM us_music WHERE genre = 'punk') UNION ...
(SELECT 1) AS select1 UNION (SELECT 2) AS select2 WHERE select1.id=select2.id
viewCount
иmovieTitle
где по одной БД на каждый месяц. Вы объединяете все 12 таблиц вместе, что нормально, но тогда вы получаете 12 отдельных наборов результатов на выходе. Что, если вам нужен только один набор результатов, в котором все результаты были бы сгруппированы,movieTitle
аviewCount
значение суммировалось для каждойmovieTitle
строки?Похоже, вы были бы счастливы с одним столом. Эти пять элементов имеют одинаковую схему, и иногда их необходимо представить так, как если бы они были получены из одной таблицы, поэтому нужно собрать все это в одну таблицу.
Добавьте новый столбец, который можно использовать для различения пяти языков (я предполагаю, что это язык, который отличается в таблицах, поскольку вы сказали, что он предназначен для локализации). Не беспокойтесь о 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, но вы обычно указываете две таблицы, если собираетесь затем объединить их вместе в какая-то мода. Структуру, с которой вы имеете дело, иногда называют секционированной таблицей, хотя обычно это делается для разделения набора данных на отдельные файлы, а не просто для произвольного разделения набора данных. Если вы отвечаете за структуру базы данных и нет веских причин для разделения данных, я бы построил одну большую таблицу с дополнительным полем «origin», содержащим код страны, но вы, вероятно, делаете это из законных соображений производительности. . Либо используйте объединение, чтобы присоединиться к вашим столам » http: //dev.mysql.http://dev.mysql.com/doc/refman/5.1/en/merge-storage-engine.html .
источник
Ваша первоначальная попытка охватить обе таблицы создает неявное СОЕДИНЕНИЕ. Это не одобряется большинством опытных программистов SQL, потому что это разделяет таблицы, которые должны быть объединены с условием, как.
Это
UNION
хорошее решение для таблиц как таковых, но не должно быть причин, по которым их нельзя поместить в одну таблицу с приличной индексацией. Я видел, как добавление правильного индекса в большую таблицу увеличивало скорость запроса на три порядка.источник
union
Заявление причины некоторого времени сделки в больших объемах данных. Выбор желательно выполнить в 2 этапа:источник