кто шарит в mysql

12
eugene-last
На сайте с 16.04.2010
Offline
57
1497

Есть такой запрос к базе mysql

mysql_query("select*from (select*from textos where (user1 = '$user1' and user2 = '$user2') or (user1 = '$user2' and user2 = '$user1') order by datetime desc limit 10) t order by datetime asc"

Что происходит? Выбираем 10 самых свежих коментов, для этого сортируем по дате вниз. Но после этого нужно чтобы эти комменты шли снизу вверх, то есть чтобы в броузере самый свежий комент был внизу страницы. Так надо. Теперь обратите внимание на букву "t" перед order by. Млин, что она означает?????? Упоминается только в этой инструкции и больше никак и нигде не используется. Без нее не работает, выдает mysql error. А с ней все как че

Мне в целом по барабану, главное что работает. Но вот просто захотелось узнать, чес я думаю это какие-то сокращения по умолчанию, но никогда с таким раньше не сталкивался

Интересный сайт знакомств - insenti.ru (http://insenti.ru)
A
На сайте с 14.11.2011
Offline
34
alw
#1

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

---------- Добавлено 07.03.2012 в 16:56 ----------

но сам по себе запрос какой то корявый

Администрирование linux, windows (/ru/forum/671883) icq 4831950
eugene-last
На сайте с 16.04.2010
Offline
57
#2

а другие бывают? Где про них прочитать можно, или хотя бы как это правильно называется?

A
На сайте с 14.11.2011
Offline
34
alw
#3

кто другие? запросы? конечно бывают )

M
На сайте с 01.12.2009
Offline
235
#4

t - это алиас. внутренний запрос выступает как таблица, из которой выбираются данные, по правилам языка ее надо назвать

Если я правильно понимаю нежно писать (SELECT ... ) AS t

p.s MySQL много отступлений от правил языка, поэтому работает и так

Администратор Linux,Freebsd. построения крупных проектов.
mr-faq
На сайте с 03.09.2007
Offline
114
#5

Возможно другой запрос еще обращается к этому аласу t. Могли бы и сообщение ошибки прислать. А вообще да, не помешает

madoff:
нежно писать
(=
Покупаю и продаю сайты только здесь (http://www.telderi.ru/?pid=270de4)
I
На сайте с 23.12.2010
Offline
25
#6
mr-faq:
Возможно другой запрос еще обращается к этому аласу t.

t доступна только в пределах этого запроса

---------- Добавлено 07.03.2012 в 22:01 ----------

а зачем там вообще подзапрос????

"order by datetime asc" вполне в пхп делается, записи-то уже отсортированы. всего делов-то, выводить массив не с начала в конец, а с конца в начало

N
На сайте с 06.05.2007
Offline
419
#7
iopiop:
"order by datetime asc" вполне в пхп делается, записи-то уже отсортированы. всего делов-то, выводить массив не с начала в конец, а с конца в начало

Потому что в абстрактном SQL этот порядок не гарантируется, но в mysql можно не сортировать.

Ну и некоторым удобнее вложить больше логики в SQL, чем вспоминать как там в php работать с массивами. Тем более это пара символов.

Кнопка вызова админа ()
I
На сайте с 23.12.2010
Offline
25
#8
netwind:

Потому что в абстрактном SQL этот порядок не гарантируется, но в mysql можно не сортировать.
Ну и некоторым удобнее вложить больше логики в SQL, чем вспоминать как там в php работать с массивами. Тем более это пара символов.

1. я не просто так выделил жирным "уже". посмотрите на запрос, записи два раза сортируются

2. да там вроде в любом случае с массивом работать, что так, что эдак. именно поэтому и не понятна двойная сортировка, зачем?

Зато без вложенного запроса обойтись можно

N
На сайте с 06.05.2007
Offline
419
#9

iopiop, вы неправильно понимаете суть sql. Никаких "уже" и предположений о последовательности выполнения запроса в sql нет. Это декларативный язык. Нужно думать об SQL как о языке описания данных, а не как об инструкциях о последовательности их получения. Тогда смысл приведенного кода будет понятен.

Такой синтаксис не обязан работать в конкретных реализациях SQL, но может - http://troels.arvin.dk/db/rdbms/#select-order_by

Например, в MSSQL синтаксически невозможно указать order by в подзапросе http://msdn.microsoft.com/en-us/library/aa259187%28v=sql.80%29.aspx#_order_by_clause

Кроме случая как у ТС, где можно использовать аналог LIMIT - TOP :

.. ( SELECT TOP N .. ORDER BY .. ) .. ORDER BY

I
На сайте с 23.12.2010
Offline
25
#10

netwind, есть запрос

mysql_query("select*from (select*from textos where (user1 = '$user1' and user2 = '$user2') or (user1 = '$user2' and user2 = '$user1') order by datetime desc limit 10) t order by datetime asc"

я предлагаю его поменять на

mysql_query("select*from textos where (user1 = '$user1' and user2 = '$user2') or (user1 = '$user2' and user2 = '$user1') order by datetime desc limit 10")

и поменять порядок обхода массива в пхп на обратный.

так понятнее что я имел ввиду под "уже", "записи два раза сортируются" и "не нужно вложенного запроса" ?

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий