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 :: Объединение 4х таблиц

 PHP.SU

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


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

> Без описания
madlabel
Отправлено: 03 Сентября, 2015 - 13:34:09
Post Id


Новичок


Покинул форум
Сообщений всего: 45
Дата рег-ции: Июль 2015  


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




Имеется в арсенале 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 записей.

Верно ли составил запрос? Как все это правильно сделать?
Может есть какие-то идеи. Буду рад любым примерам. Улыбка

(Отредактировано автором: 03 Сентября, 2015 - 14:32:09)

 
 Top
DlTA
Отправлено: 03 Сентября, 2015 - 14:08:16
Post Id



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


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


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




SELECT DISTINCT `r`.`id`, .....

групировку убрать, получите все возможные варианты
 
 Top
madlabel
Отправлено: 03 Сентября, 2015 - 14:22:46
Post Id


Новичок


Покинул форум
Сообщений всего: 45
Дата рег-ции: Июль 2015  


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




DlTA пишет:
SELECT DISTINCT `r`.`id`, .....

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


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

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

как быть?

(Отредактировано автором: 03 Сентября, 2015 - 14:24:45)

 
 Top
DlTA
Отправлено: 03 Сентября, 2015 - 15:54:41
Post Id



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


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


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




а вкурсе в чем разница JOIN и LEFT JOIN?
 
 Top
Panoptik
Отправлено: 03 Сентября, 2015 - 16:01:24
Post Id



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


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


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




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

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

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

так что определитесь что вам надо, а уже потом спрашивайте как это сделать


-----
Just do it
 
 Top
madlabel
Отправлено: 14 Сентября, 2015 - 21:28:17
Post Id


Новичок


Покинул форум
Сообщений всего: 45
Дата рег-ции: Июль 2015  


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




Спасибо за ответы, подсмотрел реализацию в 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}.

Буду рад любым советам!
 
 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