[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: последовательная выборка из нескольких таблиц.
skolozhabskiy
добрый день

1. есть 10 одинаковых таблиц (имена полей или столбцов) с разными данными:
например,

Таблица_№1
Таблица_№2
Таблица_№3
Таблица_№4
.......
Таблица_№10

2. имена этих таблиц динамически заносятся в поле "tableName" другой таблицы "таблица_№11" в зависимости от того что выбирает пользователь - ноутбук какой-то марки, карандаш, резинку разной твердости или ручку, например:

id user product tableName prodId
1 sasa ноутбук Т Таблица_№1 3
2
dara карандаш Таблица_№5 1
3
sasa ручка Таблица_№2 6
4
sasa резинка-тверд. Таблица_№7 1
5
sasa ноутбук М Таблица_№1 5
6
sasa резинка-мягкая Таблица_№7 2

и так далее, число таблиц занесенных в таблицу "таблица_№11" может меняться динамически. какие-то добавляются, какие-то удаляются в зависимости от поля user.

Получить имена таблиц относящиеся к пользователю "sasa" поля "user" и с исключением повторений можно так:


$user = 'sasa';
$query = "SELECT DISTINCT `tableName` FROM `Таблица_№11` WHERE `user`='$user'";
$result = mysql_query($query)

В результате мы получим: "Таблица_№1", "Таблица_№2" и "Таблица_№7". То есть для пользователя sasa необходимо выбрать данные из этих таблиц. Здесь все понятно.

Вопрос: как одим запросом, зная имена таблиц (поле "tableName") для пользователя "sasa" и идентификационный номер просмотренного товара "prodId" в этих таблицах, получить соответствующие данные об этом товаре из всех таблиц последовательно без циклов?

запрос типа:


$query = "SELECT * FROM (SELECT DISTINCT `tableName` FROM `Таблица_№11` WHERE `user`='$user') WHERE id=Таблица_№11.prodID";


не работает.

никаких перекрещиваний, объединений нет (UNION, JOIN и так далее), просто необходимо последовательно, зная имена таблиц и id товара, на которые ссылается запись-выборка "sasa", выбрать требуемые данные о нем.

какой самый простой и "элегантный" путь решения проблемы.

спасибо за любой совет и помощь.



Спустя 1 час, 41 минута, 38 секунд (14.08.2011 - 12:49) kirik написал(а):
Цитата (skolozhabskiy @ 14.08.2011 - 04:08)
какой самый простой и "элегантный" путь решения проблемы.

Я так подозреваю что правильный ответ будет: переделать всё к чертям smile.gif Ну не должно быть такого как у вас никак (я имею ввиду таблицы 1..10 для данных одного типа).

А если не переделать, то только несколькими запросами.. Или может процедурой, но тоже костыль.

Спустя 2 минуты, 56 секунд (14.08.2011 - 12:52) jetistyum написал(а):
А вообще согласен с kirik архитектура базы данных ни к черту.

Спустя 48 секунд (14.08.2011 - 12:53) skolozhabskiy написал(а):
спасибо за ответ, но ничего переделывать не нужно, каждая таблица - это каталог товаров, например книги, двигатель машины, ноутбуки, канцелярские товары. зачем их объединять или что-то переделывать. просто я просил помочь написать одним запросом извлечение из конкретной таблицы свойств товара по его идентификатору.

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

спасибо и надеюсь что кто-то все же даст дельный совет

вопросы о переделках прошу более не подымать.

Спустя 13 минут, 37 секунд (14.08.2011 - 13:07) jetistyum написал(а):
в каждом магазине хранятся товары, но даже самые разные товары хранятся в одной таблице... Одним запросом, вероятно, не получится.

Спустя 3 минуты, 3 секунды (14.08.2011 - 13:10) skolozhabskiy написал(а):
у каждого свой взгляд на то как должны хранится, например товары. это только для примера я привел.

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

спасибо

Спустя 1 час, 22 минуты, 2 секунды (14.08.2011 - 14:32) jetistyum написал(а):
если данные идентичны - UNION запросом. при формировании запроса подставляешь id и названия таблиц.

Спустя 25 минут, 10 секунд (14.08.2011 - 14:57) skolozhabskiy написал(а):
спасибо за ответ, это-то понятно,но как в данном случае использовать UNION? можете привести пример? спасибо

ну, допустим из

$user = 'sasa';
$query = "SELECT DISTINCT `tableName` FROM `Таблица_№11` WHERE `user`='$user'";
$result = mysql_query($query);
while ($row = mysql_fetch_assoc($result)) {
$galleries[] = $row['brandTable'];
}

можно получить массив $galleries имен таблиц в виде "Таблица_№1", "Таблица_№2" и "Таблица_№7" и как это дальше использовать?

$ids = join(',',$galleries);
$query = "SELECT * FROM $ids WHERE id=Таблица_№11.prodId AND name=Таблица_№11.prodName";

так тоже не работает

как в данном случае использовать UNION?

спасибо
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.