IMHO.WS

IMHO.WS (https://www.imho.ws/index.php)
-   Веб-программирование (https://www.imho.ws/forumdisplay.php?f=29)
-   -   Совмещение двух SQL query (https://www.imho.ws/showthread.php?t=55256)

Psionic Vision 31.03.2004 00:26

Совмещение двух SQL query
 
Есть query:

PHP код:

$smilies=$DB_site->query("SELECT smilietext,smilieid,title,smiliepath,showid FROM smilie ORDER BY showid LIMIT ".($limitlower-1).",$perpage"); 

Сказано заменить на:

PHP код:

$smilies=$DB_site->query("SELECT smilietext,smilieid,smilie.title,smiliegroup.title AS catname,smiliepath,smiliecat FROM smilie LEFT JOIN smiliegroup ON smiliecat=smiliegroup.smiliegroupid ORDER by smilie.title LIMIT ".($limitlower-1).",$perpage"); 

Однако, мне нужно во второй вариант добавить элементы showid из первого. (для справки: пример накладки двух хаков)
Так вот, как грамотно это сделать?
Предположение:

PHP код:

$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"); 


Hubbitus 31.03.2004 00:39

Ну если не смущает изменение сортировки, то в принципе правильно все.
Разве что можно для верности добавить имя таблицы, т.е. вместо showid написать smilie.showid (так точнее, но не обязательно если во второй таблице нет поля с таким же именем)

Psionic Vision 31.03.2004 00:55

У так:

$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

Hubbitus 31.03.2004 01:40

Точно, точно... не заметил...
А AS работает просто как алиас имени, тоесть теперь вместо smiliegroup.title можно ссылаться просто catname вот и все.

Psionic Vision 31.03.2004 02:36

Hubbitus
То есть, берется таблица smilie и в нее "вирутально" вставляются линии из smiliegroup так что получается вместо

SELECT smilietext,smilieid,smilie.title,showid,smiliegroup.title AS catname,smiliepath,smiliecat

вот это

SELECT smilietext,smilieid,smilie.title,showid,catname,smiliepath,smiliecat

т.е. оно вроде как воспринимается как одна таблица, так?

is_absent 31.03.2004 07:03

Neo
Нет, конструкция "field_name as alias" нужна не более чем для удобства разработчика. Эта конструкции "переименовывает" поле field_name в alias в конечной таблице... Этот альяс можно использовать, если я не ошибаюсь, только в операторе ORDER BY, поскольку только он выполняется после оператора SELECT. запрос типа "SELECT smilietext,smilieid,smilie.title,showid,catname,smiliepath,smiliecat" работать не будет, по причине отсутствия поля в табличке
Все запросы которые ты написал, работоспособные другое дело, что они возвращают не то, что ты ожидал :)

Hubbitus 31.03.2004 14:57

2 Neo в принципе правильно написал @_is_absent , но есть некоторые замечания:
AS не вставляет линии из одной таблицы в другую, как ты выразился... Приблизительно это делает конструкция LEFT JOIN во втором твоем коде.
Имя, заданное через AS можно использовать не только в операторе GROUP BY, а также в условиях отбора (WHERE), ORDER BY, как новые вычисляемые значения (если это команда UPDATE, а не SELECT), в некоторых других местах.... И еще самое главное, в PHP, разбирая полученные из БД данные и используя ассоциативный массив для этого ключом в массиве тоже будет это имя.

Цитата:

@_is_absent:
апрос типа "SELECT smilietext,smilieid,smilie.title,showid,catname,smiliepath,smiliecat" работать не будет, по причине отсутствия поля в табличке
Оператор AS задает имя только на текущюю транзакцию БД, тоесть если используются транзакционные таблицы и журнал транзакций включен то поидее (сам я не пробовал) такой запрос в пределах одной транзакции вполне валиден!

is_absent 31.03.2004 15:20

Hubbitus
Цитата:

Оператор AS задает имя только на текущюю транзакцию БД, тоесть если используются транзакционные таблицы и журнал транзакций включен то поидее (сам я не пробовал) такой запрос в пределах одной транзакции вполне валиден!
ну... так делать из известных мне СУБД умеет только Оракл.

Тут речь идет о MySQL. и он не позволяет вставлять альясы в where. а вот в group by и having -- пожалуйста. Дело в том, что MySQL (да и многие другие СУБД) обрабатывают запрос в порядке from,where,select,group by,having,order by[, limit]. следовательно, как я уже говорил, СУБД просто не знает альяса, который ты написал в select, когда выполняется разбор where и from.

Hubbitus 31.03.2004 16:45

Цитата:

@_is_absent:
ну... так делать из известных мне СУБД умеет только Оракл.
Неправда!!! Многие умеют! И в том числе MySQL (я не забыл что о ней идет речь) с таблицами InnoDB (может быть еще с какими-то может)!!!!!

Цитата:

@_is_absent:
Тут речь идет о MySQL. и он не позволяет вставлять альясы в where
Да, вот с этим согласен, погорячился...

А с остальным я и не спорил, только хотел подчеркнуть что не только в ORDER BY (как у тебя было указано в первом посте). А также отметил про некоторое удобство работы с AS в PHP.

Psionic Vision 01.04.2004 04:13

Понятно, спасибо.
А где можно поподробней почитать про LEFT JOIN?
Если я все правильно понял, то здесь:

"SELECT smilie,smilieid AS num FROM smilies ORDER BY num"

будет группировка по smilid, так?

is_absent 01.04.2004 05:05

Neo
Цитата:

А где можно поподробней почитать про LEFT JOIN?
Да в родной документации. или в русском ее переводе на www.mysql.ru
Цитата:

"SELECT smilie,smilieid AS num FROM smilies ORDER BY num"
Нет. Если ты не пишешь group by, группировка не происходит. order by просто сортирует записи.

Psionic Vision 01.04.2004 05:38

@_is_absent
ну, я оговорился. я имел ввиду сортировку. а что такое группировка?
пойду читать документацию... :dance:

is_absent 01.04.2004 06:19

Neo
Цитата:

а что такое группировка?
попробую объяснить. в общем ты указываешь поля, по которым будет делаться группировка, и СУБД создает группы из уникальных значений этих полей...

Psionic Vision 03.04.2004 01:18

@_is_absent
Не очень понятно, но ладно... почитаю документацию - пойму... может быть :)


Часовой пояс GMT +4, время: 12:08.

Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.