2010-08-26 5 views
8

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

SELECT name FROM table1,table2,table3,table4 

И я пытался, но это не работает:

SELECT name FROM * 

Есть ли способ, чтобы выбрать все таблицы в без перечисления каждой таблицы в запросе?

+0

Возможно, вам нужно сделать соединение - ваше решение ниже может быть изменено для создания динамического SQL-оператора, который выглядит как «Выбрать * из списка 1» из таблицы 2 union .. ' –

+0

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

ответ

0

Похоже, вы хотите, чтобы UNION объединил каждый стол, чтобы получить результаты, как если бы они были одним большим столом. Вам нужно выписать запрос в полном объеме, как

SELECT * FROM table1 UNION SELECT * FROM table2 UNION ... SELECT * FROM tableN 

Копировать & паста может быть вашим другом здесь.

Мне любопытно, почему у вас много разных таблиц с одинаковой структурой?

+0

Я работаю над онлайн-файловым браузером, каждый каталог имеет свою собственную таблицу «файлы/изображения /, файлы/видео /, файлы/музыка /» и т. Д. Записи в каждой таблице - это описание имени файла подробных сведений о файлах и т. Д. Первоначально у меня были все файлы, перечисленные в одной таблице.но у меня было более 5000 записей и запросов были медленными, поэтому теперь таблицы автоматически создаются каждый раз, когда я добавляю каталог, записи автоматически сохраняются каждый раз, когда файлы загружаются, теперь я tring, чтобы создать функцию поиска для пользователей, и я хочу искать все каталоги или таблицы – dlaurent86

+6

'у каждой директории есть своя таблица. OMG –

+2

Когда ваш запрос медленный с 5000 записями, нужно либо некоторое время индексировать, либо переопределить структуру вашей таблицы. Создание таблицы для каждого каталога будет проблемой более высокой производительности, чем наличие отдельной таблицы с соответствующим индексом и дизайном. – DrColossos

1

Насколько я знаю, таких подстановочных знаков для выбора из * всех таблиц нет. Я бы порекомендовал написать view, а затем назову это view (он сохранит вас, выписывая имена каждый раз) - VoodooChild

1

Я нашел решение, но мне все равно хотелось бы узнать, есть ли более простой способ или лучшее решение.

Но вот что я придумал:

$tables = mysql_query("show tables"); 
$string = ''; 
while ($table_data = mysql_fetch_row($tables)){ 
    $string.=$table_data[0].','; 
} 
$ALL_TABLES = substr($string,0,strlen($string)-1); 
$sql="SELECT name FROM $ALL_TABLES "; 
+0

Я все еще думаю, что вы хотите, чтобы UNION каждая таблица была объединена, потому что указание «table1, table2, table3» и т. Д. В предложении FROM подразумевает, что вы хотите * соединить * таблицы (не то же самое, что добавлять их последовательно), а не включая любые критерии для соединения, вы получите декартовой продукт. – sasfrog

+2

Я не рекомендую этот подход, но у меня есть для вас один намек: http://www.php.net/implode –

+0

Да, хорошо, я всю ночь пытался это понять. и мое решение не срабатывало, когда я пытался запустить «SELECT name FROM $ ALL_TABLES» получил эту ошибку «Ошибка MySQL: # 1052 -« Идентификатор столбца »в списке полей неоднозначен» , поэтому я закончил создание таблицу поиска со всеми файлами внутри таблицы, и я просто выполняю полный поиск по этой таблице. – dlaurent86

1

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

Тогда выберите все будет без проблем.

5

i am working on a online file browser, each directory has its own table

Это очень неполезное из-за одной причины: если у вас есть около 200 файлов (эта ситуация реальна, да?) У вас есть около 200 таблиц. И если в каждом каталоге имеется около тысячи файлов и т. Д. За какое-то время у вас будет либо медленная обработка, либо выбор из вашей базы данных, либо придется покупать больше ресурсов сервера.

Я думаю, что вы должны изменить структуру своей базы данных: просто начните с добавления столбца parent_folder_id в свою таблицу, после чего вы можете поместить все свои строки (файлы и каталоги - потому что каталог также является файлом - здесь вы можете добавить type чтобы определить это) в одну таблицу.

+0

Наконец-то один парень, который задает общее решение. –

Смежные вопросы