[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Многотабличный запрос
kollega
Подскажите лучше сделать так:
$res = mysqlQuery("SELECT id, cat, razd, title, description, obrabotchik, title_cat, eng_title, name 
FROM `data`, `razdel`, `categories`
WHERE `razdel`.obrabotchik = 'games'
AND `data`.razd = `razdel`.id_razd
AND `categories`.id_cat = `data`.cat
ORDER BY `id` DESC"
);


Или сделать несколько запросов? И вообще стоит ли использовать многотабличные запросы?



Спустя 1 минута, 42 секунды (5.03.2011 - 22:57) alex12060 написал(а):
Сейчас тебе объяснят.
Тут нужно использовать JOIN LEFT и IN

Я только начал изучать это, поэтому, плохой советчик буду)

Спустя 5 минут, 25 секунд (5.03.2011 - 23:02) kollega написал(а):
ок, подождёмс)))

Спустя 11 минут, 47 секунд (5.03.2011 - 23:14) Trianon написал(а):
В каждом конкретном случае может оказатьсмя по-разному.

Многое определяется, как объемом таблиц, принадлежностью полей, путем доступа к данным.
У Вас, кстати, не видно, какой таблице принадлежит id , по которому идет сортировка, о наличии индексов можно лишь догадываться.

Видно лишь что таблицы связаны цепочкой ключей.
В принципе, при прочих равных - повод сделать запрос многотабличным.
Правда, я бы расписал его через операции JOIN ... ON - тогда бы он стал более читабелен.

Спустя 6 минут, 29 секунд (5.03.2011 - 23:21) kollega написал(а):
а где можно почитать про JOIN ... ON ?

Спустя 3 минуты, 58 секунд (5.03.2011 - 23:25) alex12060 написал(а):
По мне так, здесь обычный INNER JOIN подойдет.

Спустя 51 минута, 12 секунд (6.03.2011 - 00:16) inpost написал(а):
$res = mysqlQuery("SELECT a.`id`, a.`cat`, a.`razd`, a.`title`, a.`description`, a.`obrabotchik`, b.`title_cat`, b.`eng_title`, c.`name`
FROM `data` as `a`
LEFT JOIN `razdel` as `b` ON a.`id_razd` = b.`id_razd`
LEFT JOIN `categories` as `c` ON c.`id_cat` = a.`cat`
WHERE a.`obrabotchik` = 'games'
GROUP BY a.`id_razd`
ORDER BY a.`id` DESC
"
);
Только не помню, есть ли между LEFT JOIN запятая как разделитель, может быть GROUP и ORDER BY местами поменять, но кажется так, и последнее, имена ячеек обозначить правильно, я не знаю какие данные в какой таблице.

Спустя 17 дней, 14 часов, 26 минут, 7 секунд (23.03.2011 - 14:42) kollega написал(а):
А есть какая-нибудь литературка, где можно почитать про эти многотабличные запросы, а то я все равно, что-то не догоняю)))

Спустя 21 минута, 39 секунд (23.03.2011 - 15:04) sergeiss написал(а):
kollega - берешь любой мануал по MySQL и читаешь там про JOIN. Хоть в бумажном виде, хоть в электронном.

Кстати говоря, для тех, кто не знает: в первом запросе в этой теме используется CROSS JOIN, хотя слово JOIN и отсутствует в запросе.

Спустя 17 минут, 45 секунд (23.03.2011 - 15:21) Trianon написал(а):
inpost

Фактически, запятая - синоним слову JOIN .
Вернее его умалчиваемому варианту "CROSS JOIN" ( в который JOIN превращается при отсутствии ON) , как уже заметил sergeiss.

А вот LEFT соединения в оригинале не было.
Было [INNER] JOIN

касательно порядка GROUP и ORDER - у Вас всё корректно.
Правильный порядок
WHERE
GROUP
HAVING
ORDER
LIMIT

Спустя 3 часа, 15 минут, 57 секунд (23.03.2011 - 18:37) kollega написал(а):
$res = mysqlQuery("SELECT a.`id`, a.`cat`, a.`razd`, a.`title`, a.`description`, a.`obrabotchik`, b.`title_cat`, b.`eng_title`, c.`name`
FROM `data` as `a`
LEFT JOIN `razdel` as `b` ON a.`id_razd` = b.`id_razd`
LEFT JOIN `categories` as `c` ON c.`id_cat` = a.`cat`
WHERE a.`obrabotchik` = 'games'
GROUP BY a.`id_razd`
ORDER BY a.`id` DESC
"
);

При первом 'LEFT JOIN' я как понял сравнивается таблица 'a' с таблицей 'b'. А при втором 'LEFT JOIN'? Сравнивается таблица 'a' с 'c'?

Спустя 43 минуты, 21 секунда (23.03.2011 - 19:21) sergeiss написал(а):

Цитата (kollega @ 23.03.2011 - 19:37)
А при втором 'LEFT JOIN'? Сравнивается таблица 'a' с 'c'?

Тут никакие таблицы не сравниваются!!!

SELECT a.`id`, a.`cat`, a.`razd`, a.`title`, a.`description`, a.`obrabotchik`, b.`title_cat`, b.`eng_title`, c.`name`
FROM `data` as `a`
LEFT JOIN `razdel` as `b` ON a.`id_razd` = b.`id_razd`
LEFT JOIN `categories` as `c` ON c.`id_cat` = a.`cat`
WHERE a.`obrabotchik` = 'games'
GROUP BY a.`id_razd`
ORDER BY a.`id` DESC

Сначала берутся данные из таблиц `data` и `rasdel`. И выбираются только те строки, для которых выполнено условие a.`id_razd` = b.`id_razd`. В результате где-то внутри SQL получается новая таблица. В каждой строке новой таблицы есть нужные колонки из первых таблицы (указанные в списке в начале).
Затем берём это новую таблицу и таблицу `categories`. И делаем то же самое, что и в начале: выбираем из таблиц те строки, которые удовлетворяют условию c.`id_cat` = a.`cat`. Полученный результат записывается в промежуточную таблицу.
С помощью условия WHERE a.`obrabotchik` = 'games' выбираем только часть строк из полученной промежуточной выборки, которые пишем опять же в очередную промежуточную таблицу.
Далее данные группируются по параметру a.`id_razd` (получаем еще одну очередную промежуточную таблицу :)) и уже окончательно сортируем. Полученный результат передаётся ПХП-скрипту.

Спустя 1 час, 15 минут (23.03.2011 - 20:36) kollega написал(а):
sergeiss +++++, огромное тебе спасибо. Я наконец-то разобрался user posted image
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.