SQLinfo.ru - Все о MySQL

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

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

Вы не зашли.

#1 09.04.2011 18:34:02

Dimitry
Участник
Зарегистрирован: 09.04.2011
Сообщений: 3

Выборка данных с подстановкой и с сортировкой

Здравствуйте, есть таблица отзывов о каком-то товаре, сортировка по полю id, если пользователь решает не просто прокомментировать, а ответить на какой-то комментарий, как вставить эти ответы между самими комментариями при помощи запроса? Пробовал, пытался, получился запрос с подзапросом, но самого главного он не делает, а выдает все просто как по ORDER BY, как бы результат выборки подзапроса вставить в сам запрос туда куда нужно?


SELECT opinionId, produceId, name, email, content, date, parentId FROM OPINION where produceId=36 AND EXISTS
(SELECT opinionId, produceId, name, email, content, date, parentId FROM OPINION where produceId=36 AND parentId <> 0)
ORDER BY opinionId;
 

Неактивен

 

#2 11.04.2011 00:23:15

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

Re: Выборка данных с подстановкой и с сортировкой

Если комментариев ожидается немного (например, порядка десяти), то можно плюнуть
на индекс при сортировке и сортировать каким-то сложным выражением (например,
ORDER BY IF(parentId = 0, opinionId * 1000000, parentId * 1000000 + opinionId)

В случае же с большим количеством комментариев, лучше выбирать подзапросами
(и строить потоки в интерфейсе, наверное).

Неактивен

 

#3 11.04.2011 17:16:31

Dimitry
Участник
Зарегистрирован: 09.04.2011
Сообщений: 3

Re: Выборка данных с подстановкой и с сортировкой

paulus, я решил не не изменять порядок вывода при помощи SELECT, а вставлять новое сразу туда, куда надо, нашел одну функцию "ON DUPLICATE KEY UPDATE", но немогу сформировать запрос по идее она должна делать UPDATE поля Id, но на деле этого нет, возможно ли вообще вставить новое поле с уже существующим Id, а старое изменить на +1?:


INSERT INTO OPINION set `opinionId`=3, `produceId`=36, `name`='qwer', `email`='qwer', `content`='qwer', `date`=CURRENT_TIMESTAMP, `parentId`=3 ON DUPLICATE KEY UPDATE `opinionId`=VALUES(`opinionId`);
 

все значения берутся из переменных, а SELECT выполняется обычным запросом с сортировкой по Id, но в обратном порядке.

Отредактированно Dimitry (11.04.2011 17:34:14)

Неактивен

 

#4 12.04.2011 21:00:57

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

Re: Выборка данных с подстановкой и с сортировкой

А если у Вас будет миллион комментариев и добавят ответ к первому? big_smile

Неактивен

 

#5 13.04.2011 19:00:32

Dimitry
Участник
Зарегистрирован: 09.04.2011
Сообщений: 3

Re: Выборка данных с подстановкой и с сортировкой

paulus, я решил подругому поле parentId изменил на orderId, в 1 сообщении там 1 и при поступлении нового сообщения номера уже имеющихся сдвигаются в сторону увеличения, а новое вставляется под номером того, на которое ответили и порядок расположения сохраняется:


function addAnswerInsert($id, $name, $mail, $text, $idOp) //ф-я, вставляю ответ на отзыв в б.д.
    { //для вставки ответа на коммент, к orderId коммента на который ответили + 1 и к остальным, orderId которых больше + 1 тоже, затем всавляю новый коммент с тем orderId, который был у того на кот.ответили
        $nm = preg_match('/^[\w\W\s]{1,40}$/', $name); //ограничение на ввод логина
        $ml = preg_match('/^[^^@].{1,15}@[a-z]{1,9}\.[a-z]{2,5}$/i', $mail);//пров.email
        $text = substr($text, 0, 500);  //обрезка строки текста, если она больше 500 символов
        if($nm != 0 && $ml != 0)
        {
            $sql = "UPDATE ".TABLE_OPINION." SET orderId=IF(orderId>=$idOp,orderId+1,orderId)";
            $or_id = db_query($sql) or die (db_error());

            $qStrAns = sprintf("INSERT INTO ".TABLE_OPINION." set `produceId`='%u',
                                                                  `name`='%s',
                                                                  `email`='%s',
                                                                  `content`='%s',
                                                                  `date`=CURRENT_TIMESTAMP,
                                                                  `orderId`='%u'"
,
                                                                  mysql_real_escape_string($id),
                                                                  mysql_real_escape_string($name),
                                                                  mysql_real_escape_string($mail),
                                                                  mysql_real_escape_string($text),
                                                                  mysql_real_escape_string($idOp));
            $res = db_query($qStrAns) or die(db_error());
            db_freeResult($or_id);
            db_freeResult($res);
        }
    }
 


Спаси Господи за помощь.)

Диплом на php+mysql:
http://narod.ru/disk/9268701001/diploma.rar.html

Отредактированно Dimitry (13.04.2011 19:05:02)

Неактивен

 

Board footer

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