Xwab
Форумыnavigate_nextНебольшие вопросы по PHP/MySQL

JOIN =) почти правильный запрос
Сообщения
apple

Уже почти год практикую пхп. Очень нравится, особенно видеть результат. Но я не об этом =D
Короче.
Сделал я модуль друзей. И нужно сделать раздел "друзья онлайн". Но для этого нужно воспользоваться такой штукой как INNER JOIN в MySQL.
Делаю я это впервые. И так, что бы все было ясно, расскажу ка я вам про этих две таблицы которые нужно слепить.
1. addfriends - сюда записывается вся дружба. Есть поля: added(ид добавленного) и adds (ид добавляющего).
2. users - тут ничего особенного, инфа про пользователей, нас тут больше интересует поле `line`, в ней находится информация о статусе пользователя в сети (онлайн он или оффлайн).

в таблице addfriends, ваш id может быть записан в поля как и в `added` так и `adds `, в зависимости кто кого добавляет, вы или вас.

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

[php:1:2b069480fc]SELECT * FROM `addfriends` INNER JOIN `users` ON `users`.`id` = `addfriends`.`adds` and `addfriends`.`added` WHERE `addfriends`.`state` = 'in friends' and (`addfriends`.`adds` = '$myid' or `addfriends`.`added` = '$myid') and `users`.`line` = 'Online' and `users`.`id` != $myid[/php:1:2b069480fc]
длинный он какой-то, но почти правильный.
Сейчас объясню каждый момент, как я это понимаю.

[php:1:2b069480fc]SELECT * FROM `addfriends` INNER JOIN `users`[/php:1:2b069480fc] выбираем все с наших двух таблиц (кстати, а как выбрать то что нужно? если меня все не устраивает? например в таблице `users` хочу выбрать только имя пользователя и его статус сети)

[php:1:2b069480fc]WHERE `addfriends`.`state` = 'in friends' and (`addfriends`.`adds` = '$myid' or `addfriends`.`added` = '$myid') and `users`.`line` = 'Online' and `users`.`id` != $myid[/php:1:2b069480fc]
итак, самое интересное.
"`addfriends`.`state` = 'in friends'" это статус дружбы, который сейчас равен 'in friends' (это значит в друзьях). Потом.
and (`addfriends`.`adds` = '$myid' or `addfriends`.`added` = '$myid' как я говорил ранее: id может быть записан в поля как и в `added` так и `adds `, в зависимости кто кого добавляет, вы или вас, по этому мы выбираем где наш id.

and `users`.`line` = 'Online' - где статус сети юзера равна Online.
and `users`.`id` != $myid - и выбираем там, где id не равна нашему id, ибо зачем мы сами у себя в списке онлайн?

и теперь кульминация:
ON `users`.`id` = `addfriends`.`adds` and `addfriends`.`added` - это я как понял клей уже. тут и проблема. ведь нам нужно и то поле и другое, и там и там могут быть id наших друзей онлайн.

Надеюсь что я не плохо расписал, и Вам будет не влом мне помочь.

19 Мар 2013, 19:46
Jadson

А предыдущая тема не об этом разве?

19 Мар 2013, 19:48
u99

ты перерасписал, лень читать столько.
Объясни в 2 словах что тебе нужно, какой запрос?

19 Мар 2013, 19:48
apple

u99, SELECT * FROM `addfriends` INNER JOIN `users` ON `users`.`id` = `addfriends`.`adds` and `addfriends`.`added` WHERE `addfriends`.`state` = 'in friends' and (`addfriends`.`adds` = '$myid' or `addfriends`.`added` = '$myid') and `users`.`line` = 'Online' and `users`.`id` != $myid

Правильно? =D
добавлено спустя 1 минуту:
Jadson, нет, а прошлой я спрашивал как объединить 2 запроса, вот, объединил, только не правильно слегка.
по ходу такое не воспринимает ON `users`.`id` = (`addfriends`.`adds` and `addfriends`.`added`)

скорее правильнее так будет ON `users`.`id` = (`addfriends`.`adds` or`addfriends`.`added`)
но оно тоже ничего не выводит, ошибки тоже

19 Мар 2013, 19:57
Fernus

SELECT * FROM `addfriends `, `users` WHERE (`addfriends `.`added` = '$MYID' OR `addfriends `.`adds` = '$MYID') AND `addfriends`.`state` = 'in friends' AND `users`.`line` = 'Online' AND `users`.`id` <> '$MYID' AND `users`.`id` IN(`addfriends `.`added`, `addfriends `.`adds`)

Попробуй...

Подправил...не так первый раз написал...

19 Мар 2013, 20:26
apple

Fernus, спасибо огромное, хороший человек=) работает ка надо. правда у тебя там ошибочки, в названии таблицы лишний пробел=) спасибо
____
кстати, а как выбрать то что нужно? если меня все не устраивает? например в таблице `users` хочу выбрать только имя пользователя и его статус сети
добавлено спустя 9 минут:
Fernus, оу, оно дважды выводит =(

19 Мар 2013, 20:57
Fernus

apple, Т.е. какие поля выводить?
В SELECT указывать можно...

SELECT `users`.`id` AS `id`, `users`.`name` AS `name`, `users`.`status` AS `status` FROM ...

Ты про это?
добавлено спустя 26 секунд:
apple, В смысле дважды?

SELECT DISTINCT `users`.`id`, * FROM `addfriends `, `users` WHERE (`addfriends `.`added` = '$MYID' OR `addfriends `.`adds` = '$MYID') AND `addfriends`.`state` = 'in friends' AND `users`.`line` = 'Online' AND `users`.`id` <> '$MYID' AND `users`.`id` IN (`addfriends`.`added`, `addfriends`.`adds`)

А так?


__________
посл.ред. 20 Мар 2013, 4:06; всего 3 раз(а) 19 Мар 2013, 20:59
apple

Fernus, выводится столько раз, сколько и найденных результатов, типа 3 друга онлайн и три раза вывелось, три раза три имени. щас попробую твой вариант еще
добавлено спустя 2 минуты:
вот че вывело You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1

19 Мар 2013, 21:05
Fernus

apple пишет:
"Fernus, выводится столько раз, сколько и найденных результатов, типа 3 друга онлайн и три раза вывелось, три раза три имени. щас попробую твой вариант еще
добавлено спустя 2 минуты:
вот че вывело You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1"

Это на какой запрос?

19 Мар 2013, 21:07
apple

Fernus, на вот этот

SELECT DISTINCT * FROM `addfriends `, `users` WHERE (`addfriends `.`added` = '$MYID' OR `addfriends `.`adds` = '$MYID') AND `addfriends`.`state` = 'in friends' AND `users`.`line` = 'Online' AND `users`.`id` <> '$MYID' AND `users`.`id` IN(`addfriends`.`added`, `addfriends `.`adds`)

19 Мар 2013, 21:09
Ответить на тему