|
|
|
| Есть три таблицы: фирмы(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. | |
|
|
|
|
|
|
|
для: 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
|
| |
|
|
|
|
|
|
|
для: Trianon
(21.09.2008 в 16:22)
| | prenadl живёт в в resp потому что для фирм и для бригад есть разные таблицы, а таблица с отзывами одна.
За запрос - большое спасибо. Многое непонятно пока, буду разбираться. | |
|
|
|
|
|
|
|
для: 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
(25.09.2008 в 08:35)
| | Проблема решилась | |
|
|
|
|