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
Форумы портала PHP.SU :: Версия для печати :: Объединение 4х таблиц
Форумы портала PHP.SU » PHP » SQL и Архитектура БД » Объединение 4х таблиц

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

1. madlabel - 03 Сентября, 2015 - 13:34:09 - перейти к сообщению
Имеется в арсенале 4 таблицы:
1.realty -> Недвижимость (id, img)
---
2.properties -> Свойства (id, titile, value)
где titile -> Название свойства, value -> значение (в виде: 1,2,3)
Пример: 1|Город|Москва,Питер,Красноярск
---
3.categories -> Категории (id, titile)
titile - Название категории
Пример: 1|Продажа
---
4.properties_realty -> Таблица связка (недвижимость & свойство) (id,realty_id,property,value)
Пример: 1|1|1|2 --> Где 2 это
$value = exploder(',',$row['values']);
$value = properties.value[2];
если смотреть по примеру Выше это будет город Красноярск.

Схема обычных свойств товаров (в моём случае свойств каталога недвижимости), дабы можно было удалять и добавлять новые свойства.

Задача: вывести всю недвижимость при этом все свойства к ним + категорию.
Делал так:

CODE (SQL):
скопировать код в буфер обмена
  1.  
  2. SELECT `r`.`id`,
  3.                                                                 `pr`.`value` AS property_value,
  4.                                                                 `p`.`value` AS all_properties,
  5.                                                                 `p`.`title` AS property_title,
  6.                                                                 `c`.`title` AS category_title
  7.                                                                 FROM `realty` AS r  
  8.                                                                        
  9.                                                                         LEFT JOIN `properties_realty` AS pr
  10.                                                                                 ON `pr`.`realty_id` = `r`.`id`
  11.                                                                                
  12.                                                                         LEFT JOIN `properties` AS p
  13.                                                                                 ON `p`.`id` = `pr`.`property`
  14.                                                                                
  15.                                                                         LEFT JOIN `categories` AS c
  16.                                                                                 ON `c`.`id` = `r`.`category`
  17.                                                                                
  18.                                                                 GROUP BY p.realty_id
  19.                                                                 ORDER BY `r`.`id` DESC
  20.  


Но, в запросе стоит GROUP by p.realty_id и он выводит на экран мне только первые свойства, т.е. если в таблице свойств есть еще какие-то свойства, помимо города, скажем площадь, то их он проигнорирует. Если убрать группировку то выведет мне x2 записей.

Верно ли составил запрос? Как все это правильно сделать?
Может есть какие-то идеи. Буду рад любым примерам. Улыбка
2. DlTA - 03 Сентября, 2015 - 14:08:16 - перейти к сообщению
SELECT DISTINCT `r`.`id`, .....

групировку убрать, получите все возможные варианты
3. madlabel - 03 Сентября, 2015 - 14:22:46 - перейти к сообщению
DlTA пишет:
SELECT DISTINCT `r`.`id`, .....

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


Помогло, но не на 100%, +заменил LEFT JOIN на JOIN - стал ближе к успеху, но всё таки что-то не так.
(Добавление)
На выходе у меня получилось:
Спойлер (Отобразить)

Выводит мне: к первому объекту город, ко второму объекту город и комнаты. (в сумме 3) Но мне бы объеденить бы это все, дабы получилось на выходе 2 значения.

как быть?
4. DlTA - 03 Сентября, 2015 - 15:54:41 - перейти к сообщению
а вкурсе в чем разница JOIN и LEFT JOIN?
5. Panoptik - 03 Сентября, 2015 - 16:01:24 - перейти к сообщению
задача слегка противоречива, и поэтому решение вы не можете найти

если вам нужно отображать сущности в каталоге, делайте один запрос на выборку сущностей (то есть с группировкой) и еще один (или по одному на каждую сущность) для вывода всех деталей (свойств) сущности

вариант без группировки тоже имеет право на жизнь, но он не даст возможности паггинировать данные + ко всему группировку и обработку свойств придется производить непосредственно в коде, а не при помощи СУБД что не есть приятно

так что определитесь что вам надо, а уже потом спрашивайте как это сделать
6. madlabel - 14 Сентября, 2015 - 21:28:17 - перейти к сообщению
Спасибо за ответы, подсмотрел реализацию в cms simpla. Но всплывает ещё вопрос. Как вывести все доп свойства в каталог? Причём сделать это красиво.
В симпла выводится так:
--- цикл ---
название товара
картинка
цена
--- конец цикла ---
(Название, картинка, цена - отдельные поля в таблице товаров, т.е не доп свойства, в шаблон каталога можно вывести как нужно, т.е:
$tpl->set('{name}', $row['name']) и так далее, но как быть с доп свойствами? Таким же макаром хочу их вывести в шаблон каталога, дабы можно было их красиво расположить, а не просто кучей вывести.

В симпле конечно хорошо и красиво все оформлено в каталоге для продаж техники и прочего, но как быть с недвижимостью? Помимо картинки и цены есть ещё и адреса, планировки, кол-во комнат и т.д. все это будет в свойствах (аттрибутах).

Если дергать свойства для каждого объекта в каталоге, то лично у меня получается так:
(Пример на колене)

PHP:
скопировать код в буфер обмена
  1. $sql = "select * from realty";
  2. foreach($sql as $row){
  3. $sql = "Select * from attributes where realty_id = $row['id']";
  4. foreach($sql as $attr){
  5. $attr .= $attr['name']
  6. }
  7.  

В шаблон атрибуты (свойства) вывожу так:
$tpl->set('{attributes}', $attr);
Но все свойства будут в куче один за другим, т.е расположить в шаблоне их не получится, т.к выводится все в {attributes}.

Буду рад любым советам!

 

Powered by ExBB FM 1.0 RC1