Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Объединение таблиц

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
ant
Отправлено: 22 Ноября, 2011 - 10:04:44
Post Id



Частый гость


Покинул форум
Сообщений всего: 133
Дата рег-ции: Янв. 2011  
Откуда: Украина, Крым


Помог: 0 раз(а)




Есть много таблиц такой структуры, назовем их tbl1, tbl2, ..., tbln:
id name number

То есть много таблиц, состоящие из трех полей, имена полей у всех одинаковые (id, name, number).

Как можно выбрать из всех этих таблиц все записи, у которых например number = 4? То есть вначале что-то вроде SELECT * FROM ... ON ..., а затем чтобы после разбора кодом php получилось:
$row[$i]['id']
$row[$i]['name']
$row[$i]['number']

Я так понимаю, это из тем многотабличные запросы, объединение таблиц и т.д., но вот не могу решить элементарную задачу...
 
 Top
Panoptik
Отправлено: 22 Ноября, 2011 - 10:19:41
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2493
Дата рег-ции: Нояб. 2011  
Откуда: Одесса, Украина


Помог: 131 раз(а)




SELECT * FROM `tbl1` WHERE `number` = 4
UNION
SELECT * FROM `tbl2` WHERE `number` = 4
и т.д

если известно точное количество таблиц то делаем всё это в цикле и формируем один большой запрос
PHP:
скопировать код в буфер обмена
  1.  
  2. $query = "SELECT * FROM `tbl1` WHERE `number` = 4";
  3. for($i = 2; $i<=n; $i++) {
  4. $query .= "UNION SELECT * FROM `tbl".$i."` WHERE `number` = 4";
  5. }
  6.  

(Добавление)
еще пробелы поставить перед и после строки в цикле, а то склеит слова и будут ошибки


-----
Just do it
 
 Top
Мелкий Супермодератор
Отправлено: 22 Ноября, 2011 - 10:22:11
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Это union'ы. При том, далеко не факт, что они окажутся быстрее, чем по одной таблице дёргать простыми запросами и собирать массив результат чисто на php.


-----
PostgreSQL DBA
 
 Top
Panoptik
Отправлено: 22 Ноября, 2011 - 10:28:07
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2493
Дата рег-ции: Нояб. 2011  
Откуда: Одесса, Украина


Помог: 131 раз(а)




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

PHP:
скопировать код в буфер обмена
  1.  
  2. for($i = 1; $i<=n; $i++) {
  3. $query .= " SELECT * FROM `tbl".$i."` WHERE `number` = 4 ";
  4. $res = mysql_query($query);
  5. while($row[] = mysql_fetch_assoc($res);
  6. }
  7.  
  8. //далее действия с $row[$index]
  9.  


-----
Just do it
 
 Top
Viper
Отправлено: 22 Ноября, 2011 - 10:40:49
Post Id



Активный участник


Покинул форум
Сообщений всего: 4555
Дата рег-ции: Февр. 2007  
Откуда: Симферополь


Помог: 98 раз(а)




union оооочень медленно будет отрабатывать. индексы идут побоку.


-----
Список фильмов с описанием, блекджеком и... для Joomla? -> https://киноархив[dot]com
Демо нового движка для сайта php.su -> php[dot]su, проект на гитхабе
 
 Top
AdMeen
Отправлено: 22 Ноября, 2011 - 10:58:31
Post Id



Посетитель


Покинул форум
Сообщений всего: 370
Дата рег-ции: Сент. 2009  
Откуда: Воронеж


Помог: 1 раз(а)




CODE (SQL):
скопировать код в буфер обмена
  1. SELECT * FROM `t1`,`t2`..`tn` WHERE `t1`.`number`=4 AND `t1`.`number`=`t2`.`number`... AND  `t1`.`number`=`tn`.`number`


или я что-то путаю?

(Отредактировано автором: 22 Ноября, 2011 - 11:03:34)

 
 Top
Самогонщик
Отправлено: 22 Ноября, 2011 - 11:28:31
Post Id



Посетитель


Покинул форум
Сообщений всего: 495
Дата рег-ции: Окт. 2011  


Помог: 8 раз(а)




путаешь. Ты делаешь внутреннее соединение и если хоть в одной таблице не будет 4, ничего не найдётся.
 
 Top
AdMeen
Отправлено: 22 Ноября, 2011 - 11:56:00
Post Id



Посетитель


Покинул форум
Сообщений всего: 370
Дата рег-ции: Сент. 2009  
Откуда: Воронеж


Помог: 1 раз(а)




Самогонщик пишет:
путаешь. Ты делаешь внутреннее соединение и если хоть в одной таблице не будет 4, ничего не найдётся.


Извиняюсь, не так понял задачу
 
 Top
ant
Отправлено: 23 Ноября, 2011 - 11:43:28
Post Id



Частый гость


Покинул форум
Сообщений всего: 133
Дата рег-ции: Янв. 2011  
Откуда: Украина, Крым


Помог: 0 раз(а)




Так как таблиц будет много, то с каждой забирать (select) данные будет накладно с точки зрения производительности. А union-ы я так понял - это то же самое. Тогда остается вариант: создавать еще ряд таблиц под эти запросы, которые фактически будут дублировать данные, но зато они будут лежать в одной таблице. Вообще бывают случаи, когда можно дублировать данные в других таблицах ради производительности?
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« SQL и Архитектура БД »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB