Уже почти год практикую пхп. Очень нравится, особенно видеть результат. Но я не об этом =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 наших друзей онлайн.
Надеюсь что я не плохо расписал, и Вам будет не влом мне помочь.
ты перерасписал, лень читать столько.
Объясни в 2 словах что тебе нужно, какой запрос?
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`)
но оно тоже ничего не выводит, ошибки тоже
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`)
Попробуй...
Подправил...не так первый раз написал...
Fernus, спасибо огромное, хороший человек=) работает ка надо. правда у тебя там ошибочки, в названии таблицы лишний пробел=) спасибо
____
кстати, а как выбрать то что нужно? если меня все не устраивает? например в таблице `users` хочу выбрать только имя пользователя и его статус сети
добавлено спустя 9 минут:
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`)
А так?
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
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"
Это на какой запрос?
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`)