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) |
какой самый простой и "элегантный" путь решения проблемы. |
Я так подозреваю что правильный ответ будет: переделать всё к чертям Ну не должно быть такого как у вас никак (я имею ввиду таблицы 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?
спасибо
ну, допустим из
$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?
спасибо