Я новичок в 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.
У ВНУТРЕННЕГО СОЕДИНЕНИЯ нет результата.
Заранее спасибо, потому что я заблокировал на несколько часов, и я признаюсь, что немного потерял себя. 😉
Форматирование выписки поможет вам 🙂
Итак, вы присоединяетесь к одному и тому же столбцу на 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;
Я думаю, что вы хотите, чтобы друзья человека, который вошел в систему. Означает, что для конкретного 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 — идентификатор пользователя, чьи друзья будут отображаться
Вы можете переписать ваш запрос как в примере ниже
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 скрипка
Большое спасибо за вашу помощь 😉
Я перепробовал все ваши ответы и с небольшим изменением, этот отлично работает даже во ВНУТРЕННЕМ, ЛЕВОМ, ПРАВОМ СОЕДИНЕНИИ …
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;