$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
Я только начал изучать это, поэтому, плохой советчик буду)
Тут нужно использовать JOIN LEFT и IN
Я только начал изучать это, поэтому, плохой советчик буду)
Спустя 5 минут, 25 секунд (5.03.2011 - 23:02) kollega написал(а):
ок, подождёмс)))
Спустя 11 минут, 47 секунд (5.03.2011 - 23:14) Trianon написал(а):
В каждом конкретном случае может оказатьсмя по-разному.
Многое определяется, как объемом таблиц, принадлежностью полей, путем доступа к данным.
У Вас, кстати, не видно, какой таблице принадлежит id , по которому идет сортировка, о наличии индексов можно лишь догадываться.
Видно лишь что таблицы связаны цепочкой ключей.
В принципе, при прочих равных - повод сделать запрос многотабличным.
Правда, я бы расписал его через операции JOIN ... ON - тогда бы он стал более читабелен.
Многое определяется, как объемом таблиц, принадлежностью полей, путем доступа к данным.
У Вас, кстати, не видно, какой таблице принадлежит 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`Только не помню, есть ли между LEFT JOIN запятая как разделитель, может быть GROUP и ORDER BY местами поменять, но кажется так, и последнее, имена ячеек обозначить правильно, я не знаю какие данные в какой таблице.
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
");
Спустя 17 дней, 14 часов, 26 минут, 7 секунд (23.03.2011 - 14:42) kollega написал(а):
А есть какая-нибудь литературка, где можно почитать про эти многотабличные запросы, а то я все равно, что-то не догоняю)))
Спустя 21 минута, 39 секунд (23.03.2011 - 15:04) sergeiss написал(а):
kollega - берешь любой мануал по MySQL и читаешь там про JOIN. Хоть в бумажном виде, хоть в электронном.
Кстати говоря, для тех, кто не знает: в первом запросе в этой теме используется CROSS JOIN, хотя слово 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
Фактически, запятая - синоним слову 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 +++++, огромное тебе спасибо. Я наконец-то разобрался