| imho.ws |
![]() |
|
|
|
# 1 |
|
Full Member
Регистрация: 05.02.2002
Адрес: Underground
Сообщения: 2 110
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
Совмещение двух SQL query
Есть query:
PHP код:
PHP код:
Так вот, как грамотно это сделать? Предположение: PHP код:
|
|
|
|
|
# 2 |
|
мод
IMHO Кодер-200(6,7,8) Регистрация: 29.03.2003
Адрес: Saint-Petersburg, Russia
Пол: Male
Сообщения: 2 734
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
Ну если не смущает изменение сортировки, то в принципе правильно все.
Разве что можно для верности добавить имя таблицы, т.е. вместо showid написать smilie.showid (так точнее, но не обязательно если во второй таблице нет поля с таким же именем)
__________________
Я делаю Линукс! Присоединяйтесь к свободным людям! Связаться со мной всегда можно по джабберу: Hubbitus@jabber.ru Pahan-Hubbitus. |
|
|
|
|
# 3 |
|
Full Member
Регистрация: 05.02.2002
Адрес: Underground
Сообщения: 2 110
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
У так:
$smilies=$DB_site->query("SELECT smilietext,smilieid,smilie.title,smiliegroup.title,showid AS catname,smiliepath,smiliecat FROM smilie LEFT JOIN smiliegroup ON smiliecat=smiliegroup.smiliegroupid ORDER BY showid LIMIT ".($limitlower-1).",$perpage"); не сработало, а сработало так: $smilies=$DB_site->query("SELECT smilietext,smilieid,smilie.title,showid,smiliegroup.title AS catname,smiliepath,smiliecat FROM smilie LEFT JOIN smiliegroup ON smiliecat=smiliegroup.smiliegroupid ORDER BY showid LIMIT ".($limitlower-1).",$perpage"); Наверно это потому, что AS относится к smiliegroup.title Хотя мне не совсем понятно, как в данном случае работает AS Последний раз редактировалось Neo; 31.03.2004 в 01:57. |
|
|
|
|
# 4 |
|
мод
IMHO Кодер-200(6,7,8) Регистрация: 29.03.2003
Адрес: Saint-Petersburg, Russia
Пол: Male
Сообщения: 2 734
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
Точно, точно... не заметил...
А AS работает просто как алиас имени, тоесть теперь вместо smiliegroup.title можно ссылаться просто catname вот и все.
__________________
Я делаю Линукс! Присоединяйтесь к свободным людям! Связаться со мной всегда можно по джабберу: Hubbitus@jabber.ru Pahan-Hubbitus. |
|
|
|
|
# 5 |
|
Full Member
Регистрация: 05.02.2002
Адрес: Underground
Сообщения: 2 110
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
Hubbitus
То есть, берется таблица smilie и в нее "вирутально" вставляются линии из smiliegroup так что получается вместо SELECT smilietext,smilieid,smilie.title,showid,smiliegroup.title AS catname,smiliepath,smiliecat вот это SELECT smilietext,smilieid,smilie.title,showid,catname,smiliepath,smiliecat т.е. оно вроде как воспринимается как одна таблица, так? |
|
|
|
|
# 6 |
|
::VIP::
Регистрация: 27.01.2004
Адрес: Россия. Барнаул
Пол: Male
Сообщения: 417
![]() ![]() ![]() |
Neo
Нет, конструкция "field_name as alias" нужна не более чем для удобства разработчика. Эта конструкции "переименовывает" поле field_name в alias в конечной таблице... Этот альяс можно использовать, если я не ошибаюсь, только в операторе ORDER BY, поскольку только он выполняется после оператора SELECT. запрос типа "SELECT smilietext,smilieid,smilie.title,showid,catname,smiliepath,smiliecat" работать не будет, по причине отсутствия поля в табличке Все запросы которые ты написал, работоспособные другое дело, что они возвращают не то, что ты ожидал
__________________
Nunc est bibendum |
|
|
|
|
# 7 | |
|
мод
IMHO Кодер-200(6,7,8) Регистрация: 29.03.2003
Адрес: Saint-Petersburg, Russia
Пол: Male
Сообщения: 2 734
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
2 Neo в принципе правильно написал @_is_absent , но есть некоторые замечания:
AS не вставляет линии из одной таблицы в другую, как ты выразился... Приблизительно это делает конструкция LEFT JOIN во втором твоем коде. Имя, заданное через AS можно использовать не только в операторе GROUP BY, а также в условиях отбора (WHERE), ORDER BY, как новые вычисляемые значения (если это команда UPDATE, а не SELECT), в некоторых других местах.... И еще самое главное, в PHP, разбирая полученные из БД данные и используя ассоциативный массив для этого ключом в массиве тоже будет это имя. Цитата:
__________________
Я делаю Линукс! Присоединяйтесь к свободным людям! Связаться со мной всегда можно по джабберу: Hubbitus@jabber.ru Pahan-Hubbitus. |
|
|
|
|
|
# 8 | |
|
::VIP::
Регистрация: 27.01.2004
Адрес: Россия. Барнаул
Пол: Male
Сообщения: 417
![]() ![]() ![]() |
Hubbitus
Цитата:
Тут речь идет о MySQL. и он не позволяет вставлять альясы в where. а вот в group by и having -- пожалуйста. Дело в том, что MySQL (да и многие другие СУБД) обрабатывают запрос в порядке from,where,select,group by,having,order by[, limit]. следовательно, как я уже говорил, СУБД просто не знает альяса, который ты написал в select, когда выполняется разбор where и from.
__________________
Nunc est bibendum |
|
|
|
|
|
# 9 | ||
|
мод
IMHO Кодер-200(6,7,8) Регистрация: 29.03.2003
Адрес: Saint-Petersburg, Russia
Пол: Male
Сообщения: 2 734
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
Цитата:
Цитата:
А с остальным я и не спорил, только хотел подчеркнуть что не только в ORDER BY (как у тебя было указано в первом посте). А также отметил про некоторое удобство работы с AS в PHP.
__________________
Я делаю Линукс! Присоединяйтесь к свободным людям! Связаться со мной всегда можно по джабберу: Hubbitus@jabber.ru Pahan-Hubbitus. |
||
|
|
|
|
# 11 | ||
|
::VIP::
Регистрация: 27.01.2004
Адрес: Россия. Барнаул
Пол: Male
Сообщения: 417
![]() ![]() ![]() |
Neo
Цитата:
Цитата:
__________________
Nunc est bibendum |
||
|
|
|
|
# 13 | |
|
::VIP::
Регистрация: 27.01.2004
Адрес: Россия. Барнаул
Пол: Male
Сообщения: 417
![]() ![]() ![]() |
Neo
Цитата:
__________________
Nunc est bibendum |
|
|
|