$res = mysqlQuery("SELECT a.`man_id`, b.`login`, c.`photo`
FROM `". IRB_DBPREFIX ."friends` a
RIGHT JOIN `" . IRB_DBPREFIX . "user` b ON b.`id` = a.`man_id`
RIGHT JOIN `" . IRB_DBPREFIX . "photo` c ON c.`id_parent` = a.`man_id`
WHERE a.`girl_id`=".(int)$_SESSION['id_profile']." AND `man_add` = 1 AND `girl_add` = 0
GROUP BY a.`man_id`
ORDER BY a.`date` DESC,
c.`date` DESC
LIMIT 5
");
Спустя 12 минут, 29 секунд (13.12.2010 - 05:12) inpost написал(а):
Я добился этого результата так. Несколько вопросов: правильно ли я оформил, и почему с RIGHT JOIN не работает следующий код, а с LEFT - работает?
А вот цитата: "RIGHT JOIN работает аналогично LEFT JOIN. Для сохранения переносимости кода между различными базами данных рекомендуется вместо RIGHT JOIN использовать LEFT JOIN.". А с RIGHT не работает... хм...
Ну и последний вопрос, на сколько пагубная данная выборка для БД? Имеет ли место такое объединение запроса? Замечу сразу, что строение таблиц такими и должны, вопрос стоит именно о рациональности данного кода, или есть другие варианты?
А вот цитата: "RIGHT JOIN работает аналогично LEFT JOIN. Для сохранения переносимости кода между различными базами данных рекомендуется вместо RIGHT JOIN использовать LEFT JOIN.". А с RIGHT не работает... хм...
Ну и последний вопрос, на сколько пагубная данная выборка для БД? Имеет ли место такое объединение запроса? Замечу сразу, что строение таблиц такими и должны, вопрос стоит именно о рациональности данного кода, или есть другие варианты?
$res = mysqlQuery("SELECT a.`man_id`, b.`login`, c.`photo`
FROM `". IRB_DBPREFIX ."friends` a
LEFT JOIN `" . IRB_DBPREFIX . "user` b ON b.`id` = a.`man_id`
LEFT JOIN `" . IRB_DBPREFIX . "photo` c ON c.`id_parent` = a.`man_id`
WHERE a.`girl_id`=".(int)$_SESSION['id_profile']." AND a.`man_add` = 1 AND a.`girl_add` = 0 AND (c.`id_parent` IS NULL OR c.`id_parent` IS NOT NULL)
GROUP BY a.`man_id`
ORDER BY a.`date` DESC,
c.`date` DESC
LIMIT 5
");
Спустя 9 дней, 2 часа, 1 минута, 15 секунд (22.12.2010 - 07:14) kirik написал(а):
Цитата (inpost @ 12.12.2010 - 21:12) |
А вот цитата: "RIGHT JOIN работает аналогично LEFT JOIN. Для сохранения переносимости кода между различными базами данных рекомендуется вместо RIGHT JOIN использовать LEFT JOIN." |
Цитата (http://www.javenue.info/post/20) |
В случае с left join из главной таблицы будут выбраны все записи, даже если в присоединяемой таблице нет совпадений, то есть условие condition не учитывает присоединяемую (правую) таблицу. .... Right join отображает все строки удовлетворяющие правой части условия condition, даже если они не имеют соответствия в главной (левой) таблице |
Цитата (inpost @ 12.12.2010 - 21:12) |
Ну и последний вопрос, на сколько пагубная данная выборка для БД? Имеет ли место такое объединение запроса? |
А почему нет? если запрос работает, то он имеет место быть
![smile.gif](http://phpforum.ru/html/emoticons/smile.gif)
И еще: как показала практика - БД плохо переваривают любое соединение таблиц при высокой нагрузке. Тоесть лучше сделать 2 простых запроса, чем один с джоинами. Но тут тоже все зависить от использования таблиц.
Спустя 22 минуты, 30 секунд (22.12.2010 - 07:36) inpost написал(а):
kirik
Из первой таблицы берутся 15 записей, всего 1 запрос с JOIN.
Если простые делать: получится 1 запрос главный, и 15 второстепенных, откуда ещё 15 второстепенных. А с JOIN получается всего один запрос.
Или все же обработать первый запрос, создать область (WHERE `id` IN ()) и сделать второй, из него создать снова область переменных, которые отправить в третий запрос снова через IN, а в конце все соеденить? Если так, то получится много строк кода, но всего 3 запроса. Думаешь, этот вариант все же будет лучше, чем один общий запрос без лишних обработок?
А как же кеш таких сложных запросов?
Из первой таблицы берутся 15 записей, всего 1 запрос с JOIN.
Если простые делать: получится 1 запрос главный, и 15 второстепенных, откуда ещё 15 второстепенных. А с JOIN получается всего один запрос.
Или все же обработать первый запрос, создать область (WHERE `id` IN ()) и сделать второй, из него создать снова область переменных, которые отправить в третий запрос снова через IN, а в конце все соеденить? Если так, то получится много строк кода, но всего 3 запроса. Думаешь, этот вариант все же будет лучше, чем один общий запрос без лишних обработок?
А как же кеш таких сложных запросов?
Спустя 3 минуты, 45 секунд (22.12.2010 - 07:40) kirik написал(а):
Цитата (inpost @ 21.12.2010 - 23:36) |
А как же кеш таких сложных запросов? |
Плохо с кэшем
![smile.gif](http://phpforum.ru/html/emoticons/smile.gif)
По запросу - посмотри его EXPLAIN если нормальный, то работать будет.
Вообще пока нет нужды что-то оптимизировать - не стоит тратить время.
_____________
Обучаю веб-программированию качественно и не дорого: http://school-php.com
Фрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).