Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Непростая задача с GROUP BY
 
 автор: Aramor   (21.09.2008 в 15:20)   письмо автору
 
 

Есть три таблицы: фирмы(firms), прайс-листы(price), отзывы(resp). Структура таблиц:

CREATE TABLE `firms` (
`id` int(25) NOT NULL auto_increment,
`name` varchar(50) default NULL,
`description` varchar(1100) default NULL,
`email` varchar(30) NOT NULL,
PRIMARY KEY (`id`)
)
//тут вроде по полям всё понятно: name-название фирмы, описание, мыло (есть to много полей, но не суть)

CREATE TABLE `price` (
`id` int(255) NOT NULL auto_increment,
`filename` varchar(255) NOT NULL,
`firm_id` int(255) NOT NULL,
`time` datetime NOT NULL,
PRIMARY KEY (`id`)
)
//таблица с информацией о прайс листах. Всё понятно.

CREATE TABLE `resp` (
`id` int(10) NOT NULL auto_increment,
`znach` int(1) NOT NULL,
`username` varchar(30) default NULL,
`comment` varchar(255) default NULL,
`date` datetime default NULL,
`firm_br_id` int(255) NOT NULL,
`prenadl` varchar(2) default NULL,
PRIMARY KEY (`id`)
)
//Таблица отзывов о фирме. Сложнее. Пользователи могут добавлять для фирмы положительные и отризательные отзывы. Если znach==2, значит добавленный отзыв - положительный, если znach==1, то отрицательный. username - имя пользователя, оставившего коментарий. comment - сам коментарий. firm_br_id - id фирмы или бригады, для которой добавлен отзыв. prenadl - "пренадлежность", фирма или бригада (есть фирмы и бригады, чтобы не создавать разные таблицы, сунул всё в одну таким образом. Если prenadl==f, то указанный id - фирмы, если b -то бригады).

Задача: нужно выводить фирмы таким образом, чтобы сначала выводились все фирмы с прайс-листом, а потом между собой они они сортировались по рейтингу (рейтинг - разница положительных и отрицательных отзывов). После того, как выведутся фирмы с прайсами, выводятся фирмы без прайса и сортируются также о рейтингу.

Сам не могу решить такую задачу. Подскажите плиз. может что-то нужно изменить, я, впринципе, готов. Если не нужно менять - ещё круче. Интересует решение вопроса имено средствами mysql.

  Ответить  
 
 автор: Trianon   (21.09.2008 в 16:22)   письмо автору
 
   для: Aramor   (21.09.2008 в 15:20)
 

Почему `prenadl` живет в `resp` а не в `firm`?

SELECT f.*, (prt IS NOT NULL) AS  ppl, COALESCE (rat,0) AS rats,
FROM firms AS f
LEFT JOIN (SELECT firm_id, MAX(time) as prt FROM price GROUP BY firm_id) AS pl 
  ON f.id = pl.firm_id 
LEFT JOIN (SELECT firm_br_id, SUM(znach*2-3) AS rat FROM resp WHERE `prenadl` = 'f' GROUP BY firm_br_id) AS rt
  ON f.id = rt.firm_br_id 
ORDER BY ppl DESC, rats DESC 

  Ответить  
 
 автор: Aramor   (21.09.2008 в 16:43)   письмо автору
 
   для: Trianon   (21.09.2008 в 16:22)
 

prenadl живёт в в resp потому что для фирм и для бригад есть разные таблицы, а таблица с отзывами одна.
За запрос - большое спасибо. Многое непонятно пока, буду разбираться.

  Ответить  
 
 автор: Aramor   (25.09.2008 в 08:35)   письмо автору
 
   для: Aramor   (21.09.2008 в 16:43)
 

Уважаемы Trianon!
Как я вам писал. у меня всё получилось. спасибо ещё раз большое. Но я столкнулся с новой проблемой.
Дело в том. что помимо того, что нужно отсортировать данные, их нужно выводить ещё в зависимости от категорий. в которых они запрашиваются. Для фирм сделал, всё получилось, а для бригад не получается. У бригад нет пока прайсов, точно не знаю. появятся они или нет. поэтому пока исключил сортировку по прайсу для бригад. Если выполнять запрос SELECT b.*, COALESCE(rat,0)... , то всё сортируется верно, а если я полученные данные засовываю в свой запрос, то выводится неверно, логику вывода вообще не могу понять, В чём может быть причина? подскажите. Структуру таблиц немного изменил. Если нужны таблицы. я приведу.

Вот запрос для бригад, выводящий неверные данные:

SELECT DISTINCT br_temp.* FROM (SELECT b.*, COALESCE(rat,0) AS rats
FROM `br` AS b
LEFT JOIN (SELECT firm_br_id, SUM(znach*2-3) AS rat FROM resp WHERE `prenadl` = 'b' GROUP BY firm_br_id) AS rt
ON b.id = rt.firm_br_id
ORDER BY rats DESC, name ) AS br_temp, `podcat_br`, `cat_podcat`, `podcat_glava`
WHERE `br_temp`.`id`=`podcat_br`.`br_id`
AND `podcat_br`.`podcat_id`=`cat_podcat`.`podcat_id`
AND `cat_podcat`.`cat_id`='27'
AND `cat_podcat`.`podcat_id`=`podcat_glava`.`podcat_id`
AND `podcat_glava`.`glava_id`='3'

А вот запрос для фирм, всё выводится как надо:

SELECT DISTINCT firms_temp.* FROM (SELECT f.*, (prt IS NOT NULL) AS ppl, COALESCE(rat,0) AS rats
FROM firms AS f
LEFT JOIN (SELECT firm_id, MAX(time) as prt FROM temp_price GROUP BY firm_id) AS pl
ON f.id = pl.firm_id
LEFT JOIN (SELECT firm_br_id, SUM(znach*2-3) AS rat FROM resp WHERE `prenadl` = 'f' GROUP BY firm_br_id) AS rt
ON f.id = rt.firm_br_id
ORDER BY ppl DESC, rats DESC, name ) AS firms_temp, podcat_firms, cat_podcat, podcat_glava
WHERE firms_temp.id=podcat_firms.firms_id
AND podcat_firms.podcat_id=cat_podcat.podcat_id
AND cat_podcat.cat_id='27'
AND cat_podcat.podcat_id=podcat_glava.podcat_id
AND podcat_glava.glava_id='2'

  Ответить  
 
 автор: Aramor   (26.09.2008 в 02:35)   письмо автору
 
   для: Aramor   (25.09.2008 в 08:35)
 

Проблема решилась

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования