[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Выборка из трёх таблиц (RIGHT JOIN) не так как над
inpost
Есть 3 таблицы, есть выборка. Проблема в том, что если в третьей таблице отсутствует запись, то выборка не происходит. А мне надо сделать так, что если нет записей в третьей таблице, то возвращалось (`c`.photo = ''), ну или как-то так, лишь бы выборка была именно по первой таблице. Прошу помощи, зарание спасибо:
        $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 не работает... хм...
Ну и последний вопрос, на сколько пагубная данная выборка для БД? Имеет ли место такое объединение запроса? Замечу сразу, что строение таблиц такими и должны, вопрос стоит именно о рациональности данного кода, или есть другие варианты?

        $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 Главное чтобы индексы в правильных местах были расставлены.
И еще: как показала практика - БД плохо переваривают любое соединение таблиц при высокой нагрузке. Тоесть лучше сделать 2 простых запроса, чем один с джоинами. Но тут тоже все зависить от использования таблиц.

Спустя 22 минуты, 30 секунд (22.12.2010 - 07:36) inpost написал(а):
kirik
Из первой таблицы берутся 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

По запросу - посмотри его EXPLAIN если нормальный, то работать будет.
Вообще пока нет нужды что-то оптимизировать - не стоит тратить время.


_____________
Обучаю веб-программированию качественно и не дорого: http://school-php.com
Фрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).
Быстрый ответ:

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