Всем привет!
Требуется составить поисковый запрос в котором бы в начале выводились результаты поиска по названию, а далее результаты поиска по другим полям. И каждый такой запрос должен быть отсортирован. Составил запрос, результаты выдает правильные, но вот с сортировкой в каждом под запросе возникли трудности. Прошу помочь разобраться где ошибка:
SELECT SQL_CALC_FOUND_ROWS (SUM(`count`)) AS `count`, `tbl`.*
FROM
(
(
SELECT (COUNT(`goods`.`id`)-1) AS `count`, `goods`.`id`, `goods`.`cat`, `goods`.`idcompany`, `goods`.`pp`, `goods`.`pp_short`, `goods`.`tels_pp`, `goods`.`price`, `goods`.`currency`, `goods`.`date_add`, `firms`.`stadofreklam_access`, `firms`.`fullname`, `firms`.`brands`, `firms`.`tels_firm`, `firms`.`site`, `firms`.`icq`, `firms`.`skype`, `firms`.`tariff`, `firms`.`city`, `firms`.`logo`, `firms`.`mail`, `firms`.`mail_is_checked`, `rubrics`.`name`, `users`.`email`, `goods_photo`.`width`, `goods_photo`.`height`, `goods_photo`.`name` AS `pic_name`, `users`.`activation`, `units`.`name` AS `units`,
DATE_FORMAT(`goods`.`last_edit`, '%d.%m.%Y') AS `dateofupdate`
FROM `goods` FORCE INDEX (`PPfull`, `pp`)
LEFT JOIN `firms` USING (`idcompany`)
LEFT JOIN `users` USING (`idcompany`)
LEFT JOIN `rubrics` ON (`rubrics`.`id` = `goods`.`cat`)
LEFT JOIN `units` ON (`units`.`id` = `goods`.`units`)
LEFT JOIN `goods_photo` ON (`goods`.`id` = `goods_photo`.`building_id`)
WHERE ((UCASE(`goods`.`pp`) REGEXP UCASE('[[:<:]]бассейн') OR `goods`.`pp` LIKE 'бассейн%' OR UCASE(`goods`.`pp_short`) REGEXP UCASE('[[:<:]]бассейн') OR `goods`.`pp_short` LIKE 'бассейн%' OR UCASE(`goods`.`pp_full`) REGEXP UCASE('[[:<:]]бассейн') OR `goods`.`pp_full` LIKE 'бассейн%' OR UCASE(`goods`.`pp_keywords`) REGEXP UCASE('[[:<:]]бассейн') OR `goods`.`pp_keywords` LIKE 'бассейн%') ) AND (`firms`.`status` BETWEEN '4' AND '7') AND `firms`.`stadofreklam_access` != '22' AND `firms`.`theme_id` IN ('4', '8') AND `firms`.`manager_id` != '39' AND `goods`.`status` = '2'
GROUP BY `idcompany`
ORDER BY `tariff` DESC
)
UNION
(
SELECT (COUNT(`goods`.`id`)-1) AS `count`, `goods`.`id`, `goods`.`cat`, `goods`.`idcompany`, `goods`.`pp`, `goods`.`pp_short`, `goods`.`tels_pp`, `goods`.`price`, `goods`.`currency`, `goods`.`date_add`, `firms`.`stadofreklam_access`, `firms`.`fullname`, `firms`.`brands`, `firms`.`tels_firm`, `firms`.`site`, `firms`.`icq`, `firms`.`skype`, `firms`.`tariff`, `firms`.`city`, `firms`.`logo`, `firms`.`mail`, `firms`.`mail_is_checked`, `rubrics`.`name`, `users`.`email`, `goods_photo`.`width`, `goods_photo`.`height`, `goods_photo`.`name` AS `pic_name`, `users`.`activation`, `units`.`name` AS `units`,
DATE_FORMAT(`goods`.`last_edit`, '%d.%m.%Y') AS `dateofupdate`
FROM `firms`
LEFT JOIN `goods` USING (`idcompany`)
LEFT JOIN `users` USING (`idcompany`)
LEFT JOIN `rubrics` ON (`rubrics`.`id` = `goods`.`cat`)
LEFT JOIN `units` ON (`units`.`id` = `goods`.`units`)
LEFT JOIN `goods_photo` ON (`goods`.`id` = `goods_photo`.`building_id`)
WHERE (((UCASE(`firms`.`fullname`) REGEXP UCASE('[[:<:]]бассейн') OR `firms`.`fullname` LIKE 'бассейн%') ) ) AND (`firms`.`status` BETWEEN '4' AND '7') AND `firms`.`stadofreklam_access` != '22' AND `firms`.`theme_id` IN ('4', '8') AND `firms`.`manager_id` != '39' AND `goods`.`status` = '2'
GROUP BY `idcompany`
ORDER BY `tariff` DESC
)
UNION
(
SELECT (COUNT(`goods`.`id`)-1) AS `count`, `goods`.`id`, `goods`.`cat`, `goods`.`idcompany`, `goods`.`pp`, `goods`.`pp_short`, `goods`.`tels_pp`, `goods`.`price`, `goods`.`currency`, `goods`.`date_add`, `firms`.`stadofreklam_access`, `firms`.`fullname`, `firms`.`brands`, `firms`.`tels_firm`, `firms`.`site`, `firms`.`icq`, `firms`.`skype`, `firms`.`tariff`, `firms`.`city`, `firms`.`logo`, `firms`.`mail`, `firms`.`mail_is_checked`, `rubrics`.`name`, `users`.`email`, `goods_photo`.`width`, `goods_photo`.`height`, `goods_photo`.`name` AS `pic_name`, `users`.`activation`, `units`.`name` AS `units`,
DATE_FORMAT(`goods`.`last_edit`, '%d.%m.%Y') AS `dateofupdate`
FROM `goods` FORCE INDEX (`pp`)
LEFT JOIN `firms` USING (`idcompany`)
LEFT JOIN `users` USING (`idcompany`)
LEFT JOIN `rubrics` ON (`rubrics`.`id` = `goods`.`cat`)
LEFT JOIN `units` ON (`units`.`id` = `goods`.`units`)
LEFT JOIN `goods_photo` ON (`goods`.`id` = `goods_photo`.`building_id`)
WHERE ((UCASE(`goods`.`pp`) REGEXP UCASE('[[:<:]]бассейн') OR `goods`.`pp` LIKE 'бассейн%') ) AND (`firms`.`status` BETWEEN '4' AND '7') AND `firms`.`stadofreklam_access` != '22' AND `firms`.`theme_id` IN ('4', '8') AND `firms`.`manager_id` != '39' AND `goods`.`status` = '2'
GROUP BY `idcompany`
ORDER BY `tariff` DESC
)
) AS `tbl` GROUP BY `idcompany` LIMIT 0, 20;
Отдельно каждый запрос юниона отдает правильно отсортированые результаты.
Отредактированно tazododu (23.11.2010 11:54:36)