Mysql запрос SELECT с левым соединением

Я новичок в MySQL, у меня было несколько курсов по MySQL, которые сейчас закончились, у меня есть домашнее задание, предоставленное нашим учителем, чтобы подготовиться к нему, но я блокирую получение данных из базы для сайта социальной сети. Я понимаю основы JOIN, но у меня все еще есть проблемы с пониманием логики типа ЛЕВОЕ СОЕДИНЕНИЕ ИЛИ ДРУГОГО типа INNER JOIN …

Вот моя проблема, у меня есть база данных с 2 таблицами,

member(id_member*, login, photo)
friend(id_member_request*, id_member_accept*, accept, date_acceptation)

Поле согласия таблицы друзей — это поле, которое позволяет мне проверить, есть ли у них друзья, установив значение 1 вместо 0.

Поля id_member_request и id_member_accept согласуются с id_member таблицы участников.

Я хочу получить логин и фотографию участников, которые являются друзьями, чтобы потом их можно было отобразить.

Я проверил несколько запросов:

SELECT m.login
, m.photo
FROM friend AS a
LEFT
JOIN member AS m
ON m.id_member = a.id_member_accept
LEFT
JOIN member AS m1
ON m1.id_member = a.id_member_request
WHERE accept = 1;

Запрос работает, но не показывает всех дружелюбных участников и даже несколько раз некоторых людей.

В ПРАВИЛЬНОМ СОЕДИНЕНИИ Результат NULL.
У ВНУТРЕННЕГО СОЕДИНЕНИЯ нет результата.

Заранее спасибо, потому что я заблокировал на несколько часов, и я признаюсь, что немного потерял себя. 😉

-2

Решение

Форматирование выписки поможет вам 🙂
Итак, вы присоединяетесь к одному и тому же столбцу на m и m1.

Следующее вернет данные, но вы должны передать id_member_request ..

DECLARE INT @MEMBERID = 2; --Example ID

SELECT m.login, m.photo
FROM friend AS a
LEFT JOIN member AS m ON m.id_member = a.id_member_accept
WHERE a.id_member_request = @MEMBERID
AND a.accept = 1;

Это вернет m.login, m.photo для всех друзей участника с идентификатором @MEMBERID;

1

Другие решения

Я думаю, что вы хотите, чтобы друзья человека, который вошел в систему. Означает, что для конкретного Member_Id здесь запрос, который поможет вам

 select * from friend a
inner join member b on (a.id_member_request=b.id_member or a.id_member_accept=b.id_member) and b.id_member=1
where accept=1

где 1 — идентификатор пользователя, чьи друзья будут отображаться

0

Вы можете переписать ваш запрос как в примере ниже

SELECT `m`.`id_member` AS `memberID`,
`m`.`login` AS `memberLoginName`,
`m`.`photo` AS `memberPhoto`,
`m1`.`id_member` AS `friendID`,
`m1`.`login` AS `friendLoginName`,
`m1`.`photo` AS `friendPhoto`,
`a`.`accept_date` AS `acceptDate`
FROM `friends` AS `a`
INNER JOIN `member` AS `m` ON `a`.`id_member_request` = `m`.`id_member`
INNER JOIN `member` AS `m1` ON `a`.`id_member_accept` = `m1`.`id_member`
WHERE `a`.`accept`=1
ORDER BY `a`.`id_member_request`,`a`.`id_member_accept` ASC

Посмотреть этот пример в SQL скрипка

0

Большое спасибо за вашу помощь 😉

Я перепробовал все ваши ответы и с небольшим изменением, этот отлично работает даже во ВНУТРЕННЕМ, ЛЕВОМ, ПРАВОМ СОЕДИНЕНИИ …

SELECT login,photo
FROM friend AS a
INNER JOIN member AS m ON ( a.id_member_request = m.id_member
OR a.id_member_accept = m.id_member )
WHERE m.id_member !=$id_member
AND a.accept=1;
0
По вопросам рекламы [email protected]