Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Сортировка без первичного ключа
Форумы портала PHP.SU » » Работа с СУБД » Сортировка без первичного ключа

Страниц (1): [1]
 

1. Еугений - 21 Августа, 2014 - 02:43:17 - перейти к сообщению
Привет, форумчане.
У меня есть таблица 'ratings' с тремя столбцами 'id_post' 'id_user' и 'ocenka'.
Пользователь голосует за пост, заносим его в бд, чтобы пресекать повторное голосование.
У каждого поста есть свой автор, и я хочу добавить возможность чтобы он мог узнать кто именно голосовал, и за какой именно его пост и какая оценка.

То есть нужно связать три таблицы posts,users и 'ratings'
как то так
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT users.login,ratings.ocenka,posts.title FROM posts,users,ratings WHERE ratings.id_post = posts.id AND ratings.id_users = users.id AND id_post = {id_моего_поста}

И мне бы хотелось, чтобы оценки выдавались так: новые - вверху, старые внизу. В таблице нет первичного ключа, а то я бы сделал order by id desc. Я поэкспериментировал, вставлял данные, но некоторые вставляются то в конец, то в начало, и в phpmyadmin смотрел и выводом на сайт.
(Добавление)
Решил, добавлю столбец data, и буду сортировать по нему, правда все старые записи будут с датой 0000-00-00 00:00:00.
Погуглил, нашел только один пост на форуме, там написали, что бд хранит добавляемые записи как ему угодно, и вывести без order by данные в нужном мне порядке не получится вроде как
2. Tyoma5891 - 21 Августа, 2014 - 09:26:52 - перейти к сообщению
Еугений пишет:
бд хранит добавляемые записи как ему угодно

это почему это? последняя запись она и есть последняя там по времени фиксируется...
3. Мелкий - 21 Августа, 2014 - 10:15:09 - перейти к сообщению
Tyoma5891 пишет:
это почему это? последняя запись она и есть последняя там по времени фиксируется...

Потому что СУБД хранит данные так, как ей хочется.
innoDB банально кластеризован по первичному ключу. Данные строки физически находятся в том же самом месте, где записано значение первичного ключа этой строки.
Бардака существенно добавляет MVCC.
Время не фиксируется, оно не нужно. MVCC заставляет фиксировать id транзакции для каждой версии записи, но упорядоченные id транзакций совершенно не обязаны соответствовать временной хронологии.

И потому что стандарт SQL явным образом говорит, что если сортировка не указана, порядок строк в результате будет произволен.

Еугений пишет:
Решил, добавлю столбец data, и буду сортировать по нему, правда все старые записи будут с датой 0000-00-00 00:00:00.

Это верное решение. Только, date. data - немного о другом.

 

Powered by ExBB FM 1.0 RC1