Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Составление SQL-запросов > mysql: некорректно выбирает запись


Автор: Risyaalex 13.1.2011, 19:20
столкнулась с таким вопросом -
таблица foto
id   ........ rating ....... lider
мне нужно выбрать строку с максимальным значением столбца rating и записать '1'  в столбец lider этой строки
 делаю такой запрос:
Код

$sql="UPDATE `foto` SET `lider`='0'";
mysql_query($sql);
$sql2=("SELECT `id` FROM `foto` ORDER BY `rating` DESC LIMIT 1");
mysql_query($sql2);
$arr=mysql_fetch_assoc($sql2);
echo $arr['id'];
$id=$arr['id'];
$sql3="UPDATE `foto` SET `lider`='1' WHERE `id`='$id'";
mysql_query($sql3);


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

Автор: triclosan 13.1.2011, 19:30
 1

Автор: Frees 14.1.2011, 08:10
Цитата(Risyaalex @  13.1.2011,  22:20 Найти цитируемый пост)
Выбирает строку какую сам захочет, даже логику выбора проследить не могу...

может несколько записей с одинаковым(максимальным) рейтингом, 
сортировка по рейтингу, но верхняя запись меняется..


Автор: Deniz 14.1.2011, 08:46
Можно добавить id в order by
Код
SELECT `id` FROM `foto` ORDER BY `rating` DESC, `id`LIMIT 1

Автор: Akina 14.1.2011, 08:46
А какой смысл тащить ID изменяемой записи на клиента, когда его можно получить непосредственно при апдейте?
Само собой, влоб это не получится - нужно создать вьюв, возвращающий нужный ID, и джойнить его в условиях отбора.

Автор: Zloxa 14.1.2011, 08:54
Цитата(Akina @  14.1.2011,  08:46 Найти цитируемый пост)
Само собой, влоб это не получится - нужно создать вьюв, возвращающий нужный ID, и джойнить его в условиях отбора.

не совсем понял.
разве так нельзя?
Код

UPDATE `foto` SET `lider`='1' WHERE `id`=(SELECT `id` FROM `foto` ORDER BY `rating` DESC/*,`id`*/ LIMIT 1)


Добавлено через 2 минуты и 6 секунд
или тогда уж ваще, вместо всех трех
Код

UPDATE `foto` SET `lider`= case when `id`=(SELECT `id` FROM `foto` ORDER BY `rating` DESC/*,`id`*/ LIMIT 1) then '1' else '0' end 

Автор: Akina 14.1.2011, 09:02
Цитата(Zloxa @  14.1.2011,  09:54 Найти цитируемый пост)
разве так нельзя?

В MySQL (а речь именно о нём) - увы, он не позволяет использовать в подзапросе изменяемую таблицу. И использование промежуточной вьюшки - именно способ обхода этого ограничения.

Автор: Zloxa 14.1.2011, 09:04
Akina, понял, спасибо.

Автор: Risyaalex 14.1.2011, 09:56
Цитата(Frees @  14.1.2011,  08:10 Найти цитируемый пост)
может несколько записей с одинаковым(максимальным) рейтингом, 
сортировка по рейтингу, но верхняя запись меняется..


нет, записи все разные...

Автор: Frees 14.1.2011, 10:16
Цитата(Risyaalex @  14.1.2011,  12:56 Найти цитируемый пост)
нет, записи все разные...

а рейтинг у них тоже разный?

Автор: Risyaalex 14.1.2011, 11:19
Цитата(Frees @  14.1.2011,  10:16 Найти цитируемый пост)
а рейтинг у них тоже разный? 


Да, я специально уже все  просмотрела. все записи разные и рейтинг нигде не повторяется - и самое главное на локалхосте все работает отлично, проверяла много раз. то же самое выкладываю на хостинг - и не работает...

Автор: Frees 14.1.2011, 11:40
может на живом сервере лидер часто меняется ?

Добавлено через 44 секунды
Цитата(Risyaalex @  14.1.2011,  14:19 Найти цитируемый пост)
и самое главное на локалхосте все работает отлично

база и сами данные идентичны серверной?

Автор: Risyaalex 14.1.2011, 12:44
Цитата(Frees @  14.1.2011,  11:40 Найти цитируемый пост)
может на живом сервере лидер часто меняется ?


нет, этот скрипт я пока тестирую, запускаю вручную ( из 5 фото с разным рейтингом - выбрать с наибольшим) 
- он вообще будет запускаться кроном раз в месяц


Цитата(Frees @  14.1.2011,  11:40 Найти цитируемый пост)
база и сами данные идентичны серверной? 


да - просто дамп базы сделала и все

Автор: Akina 14.1.2011, 12:51
Цитата(Risyaalex @  13.1.2011,  20:20 Найти цитируемый пост)
выложила на хостинг - выбирает строку какую сам захочет, даже логику выбора проследить не могу... 

В смысле при выполнении второго запроса возвращается не id записи с макс. рейтингом, а произвольный id (строка 6)? А сколько записей при этом возвращается? точно одна-единственная? 

Автор: Risyaalex 14.1.2011, 13:26
Цитата(Akina @  14.1.2011,  12:51 Найти цитируемый пост)
В смысле при выполнении второго запроса возвращается не id записи с макс. рейтингом, а произвольный id (строка 6)? А сколько записей при этом возвращается? точно одна-единственная? 

 возвращается одна запись - пока в таблице ничего не меняется возвращается одна и таже (например id 59 - хотя по рейтингу она например четвертая из пяти), добавляю или удаляю фото, или меняю значение рейтинга - и возвращается другая запись, тоже не понятно по какому параметру отобранная

Автор: Risyaalex 14.1.2011, 14:17
данные таблицы
    id       image                       view        rating     q_vote      lider
    1    20111401130206.jpg    6               4           2             0
    2    20111401130213.jpg    4               7           2             1
    3    20111401130220.jpg    8              10          3             0
    4    20111401130228.jpg    10            16          4             0
    5    20111401130234.jpg    16            18          4             0

на данный момент выбирает id 2 

Автор: Zloxa 14.1.2011, 14:18
rating - не строка ли?

Автор: Frees 14.1.2011, 14:21
Код

SELECT `id` FROM `foto` ORDER BY cast(`rating` as integer) DESC LIMIT 1

Автор: Risyaalex 14.1.2011, 14:28
Цитата(Frees @  14.1.2011,  14:21 Найти цитируемый пост)
код SQL
1:

SELECT `id` FROM `foto` ORDER BY cast(`rating` as integer) DESC LIMIT 1


не работает

Автор: Frees 14.1.2011, 14:32
Цитата(Risyaalex @  14.1.2011,  17:28 Найти цитируемый пост)
не работает

В смысле не работает. ошибка в запросе?

Автор: Risyaalex 14.1.2011, 14:38
Цитата(Frees @  14.1.2011,  14:32 Найти цитируемый пост)
В смысле не работает. ошибка в запросе? 


$sql111=mysql_query("SELECT `id` FROM `foto` ORDER BY cast(`rating` as integer) DESC LIMIT 1");
if ($sql111 == true) echo "1";
else echo "2";

результат - 2

Автор: Risyaalex 16.1.2011, 14:32
пробовала сортировать по разным столбцам, нашла закономерность - если сортирую по убыванию рейтинга строки

id  rating    получается   id   rating
1 - 4                                 1 - 4
2 - 35                               2 - 35
3 - 10                               5 - 23
5 - 23                               3 - 10 

и по другим столбцам то же самое, то есть он "4" воспринимает как "40"  или сортирует по первым цифрам суммы....

Автор: Zloxa 16.1.2011, 15:03
Risyaalex, у вас определенно рейтинг- строка и сортируется соответственно как строка а не как целое.

Добавлено через 1 минуту и 18 секунд
а cast может не отрабатывать в том числе и потому, что находятся записи, которые невозможно преобразовать из строки в целое.

Автор: Risyaalex 16.1.2011, 15:05
я разобралась!!!

у меня rating был varchar  smile 
поменяла на INT  и все стало на свои места 

 smile 

всем спасибо!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)