Хранимая процедура MySQL |Как это написать? - PullRequest
1 голос
/ 23 декабря 2010

На этот раз у меня есть вопрос MySQL, я пытаюсь создать хранимую процедуру, которая будет выполнять подготовленный оператор, цель - получить ранжированный список из таблицы ("order_info"), список разделенпо «страницам» каждая страница определяется количеством записей и должна быть упорядочена с использованием определенного поля, отсортированного либо 'ASC', либо 'DESC', каждая запись представляет собой «order». Подвох в том, что процедура возвращает заказы.определенной группы, порядок связан с user, который принадлежит group.Вот что я сделал до сих пор:


    CREATE DEFINER=`root`@`%` PROCEDURE `getGroupOrders`(IN grp INT,
                                                   IN page INT, 
                                                   IN count INT, 
                                                   IN ord TINYINT, 
                                                   IN srt VARCHAR(4)
                                                   )
    BEGIN
        PREPARE prepGroupOrders FROM
        "SELECT oi.* FROM `dbre`.`order_info` oi
            INNER JOIN `dbre`.`users` usr 
            ON oi.`username` = usr.`username` AND usr.`id_group` = ?
            ORDER BY ? ? LIMIT ?, ?";

        SET @g := grp;
        SET @cnt := count;
        SET @start := @page*count ;
        SET @orderBy := ord;
        SET @sortBy := srt;

        EXECUTE prepGroupOrders USING @g,@orderBy,@sortBy,@start,@cnt;
    END

Я получаю синтаксическую ошибку при выполнении этого, хотя редактор не выделяет никаких ошибок и позволяет мне сохранить процедуру, я думаю, что один из следующихможет происходить:

  • Я неправильно использую `ASC` или` DESC`, так как это зарезервированное слово SQL.
  • Я где-то читал, что подготовленный оператор предназначен только для ОДНОГО SQLзапрос, и так как у меня есть вложенные запросы, это не может быть сделано.

Я протестировал этот стандартный запрос:


    SELECT oi.* FROM `dbre`.`order_info` oi
        INNER JOIN `dbre`.`users` usr
        ON oi.`username` = usr.`username` AND usr.`id_group` = 1
    ORDER BY `status` DESC LIMIT 5, 10;

И он дает мне результаты, которые я хочу.Так как бы я разработал процедуру?Любая помощь действительно ценится.

1 Ответ

0 голосов
/ 23 декабря 2010

Это не обязательно решит вашу проблему, но вы, вероятно, можете немного очистить этот запрос, исключить подзапрос и получить что-то, что должно работать немного лучше.

SELECT oi.* 
    FROM `dbre`.`order_info` oi
        INNER JOIN  `dbre`.`users` u
            ON oi.username = u.username
                AND u.id_group = 1
    ORDER BY `status` DESC 
    LIMIT 5, 10;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...