SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 22.11.2010 19:02:29

tazododu
Завсегдатай
Зарегистрирован: 24.09.2010
Сообщений: 51

Независимая сортировка в каждом запросе UNION

Всем привет!
Требуется составить поисковый запрос в котором бы в начале выводились результаты поиска по названию, а далее результаты поиска по другим полям. И каждый такой запрос должен быть отсортирован. Составил запрос, результаты выдает правильные, но вот с сортировкой в каждом под запросе возникли трудности. Прошу помочь разобраться где ошибка:


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)

Неактивен

 

#2 22.11.2010 19:58:03

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Независимая сортировка в каждом запросе UNION

Когда Вы делаете группировку — Вы делаете неявную сортировку по этому
столбцу. Если сортировка не нужна — можно попробовать сделать
GROUP BY idcompany ORDER BY NULL.

Неактивен

 

#3 23.11.2010 09:44:17

tazododu
Завсегдатай
Зарегистрирован: 24.09.2010
Сообщений: 51

Re: Независимая сортировка в каждом запросе UNION

Интересный факт про неявную сортировку не знал. Поставил ORDER BY NULL, но результата это не принесло. Может имеются еще какие-либо предложения?

Неактивен

 

#4 23.11.2010 11:54:10

tazododu
Завсегдатай
Зарегистрирован: 24.09.2010
Сообщений: 51

Re: Независимая сортировка в каждом запросе UNION

решил довольно интересным способом


SELECT SQL_CALC_FOUND_ROWS (SUM(`count`)) AS `count`, `tbl`.*
FROM
(
    (
    SELECT 1 as `aa`, (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
    )
    UNION
    (
    SELECT 2 as `aa`, (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_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 2 as `aa`, (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
    )
) AS `tbl` GROUP BY `idcompany`
ORDER BY `aa` ASC, `tariff` DESC
LIMIT 0, 20;


Получается, что теперь внутренние сортировки в каждом селекте мне уже тоже не нужны будут.

Отредактированно tazododu (23.11.2010 12:01:05)

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson