1 (изменено: kolxoznik1, 2012-01-23 20:18:22)

Тема: Вывод имени пользователя по его ID

Здравствуйте !

Я имею следующие таблицы

users
id
username

images
id
user_id
image

user_follow
id
user_id
follow_id

у меня есть запрос который выводит моих друзей и друзей моих друзей, в роли главной таблицы беру "user_follow" и далее нужно подставить вмето
user_id -> username1 пользователя из таблицы Users
follow_id -> username2 пользователя из таблицы Users

На данный момент я имею такой запрос

$sql = "SELECT user_id, follow_id, username FROM users u
      INNER JOIN user_follow f on (u.id = f.follow_id)
      WHERE
      f.user_id = 3";

и он выводит следующее :

    [0] => Array
        (
            [user_id] => 3
            [follow_id] => 6
            [username] => 6666
        )

Подскажите что и куда внести (изменения в запрос) что бы вывести
[user_id] как [username1] => 'username из таблицы users'
[follow_id] как [username2] => 'username из таблицы users' (сейчас выводится как [username] => ' ')

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

2

Re: Вывод имени пользователя по его ID

[РЕШЕНИЕ]

Вроде решил проблему,

$sql = "SELECT fn.username as username1, u.username as username2
FROM
  users u
  INNER JOIN user_follow f on (u.id = f.follow_id)
  JOIN users AS fn ON (f.user_id=fn.id)
WHERE
  f.user_id = 3";

вот такой получился запрос и выводит что и нужно

   [0] => Array
        (
            [username1] => 3333
            [username2] => 6666
        )

Подскажите может можно как то оптимизировать запрос ?

3

Re: Вывод имени пользователя по его ID

Попробуйте так.

$sql = "SELECT `u`.`username` AS `username1`, `u2`.`username` AS `username2`
FROM `users` AS `u`
      INNER JOIN (`user_follow` AS `f`, `users` AS `u2`) on (`u`.`id` = `f`.`follow_id` AND `f`.`user_id` = `u2`.`id`)
      WHERE
      `f`.`user_id` = 3";

4 (изменено: kolxoznik1, 2012-01-23 23:28:45)

Re: Вывод имени пользователя по его ID

Спасибо ! Я решил продолжить модификацию данного запроса и вывести как раннее говорил, своих друзей с фотографией (последней) или пустой массив скажем ['image'] =>

Я добавил в ваш запрос

(добваление картинки если существует, в противном случае null)

LEFT OUTER JOIN images i on f.follow_id = i.user_id


полный вид запроса:

$sql = "SELECT `u`.`username` AS `username1`, `u2`.`username` AS `username2`, i.image, i.date, i.id
FROM `users` AS `u`
      INNER JOIN (`user_follow` AS `f`, `users` AS `u2`) on (`u`.`id` = `f`.`follow_id` AND `f`.`user_id` = `u2`.`id`)
      LEFT OUTER JOIN images i on f.follow_id = i.user_id
      WHERE
      `f`.`user_id` = 3";

и вот что мне выдает :

    [0] => Array
        (
            [username1] => 6666
            [username2] => 3333
            [image] => test_one_more.jpg
            [date] => 2012-01-23 21:15:27
            [id] => 11
        )

    [1] => Array
        (
            [username1] => 6666
            [username2] => 3333
            [image] => my.test2.jpg
            [date] => 2012-01-23 20:49:29
            [id] => 9
        )

    [2] => Array
        (
            [username1] => 6666
            [username2] => 3333
            [image] => test3.jpg
            [date] => 2012-01-23 20:50:28
            [id] => 10
        )

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

    [0] => Array
        (
            [username1] => 6666
            [username2] => 3333
            [image] => test_one_more.jpg
            [date] => 2012-01-23 21:15:27
            [id] => 11
        )

так как изображение было самое последнее у этого пользователя (видно по id и дате (время добавления))

Я считаю проблема здесь f.follow_id = i.user_id вывод всех где имя пользователя повторяется, имея 2 фото, у обоих будет одинаковый идентификатор пользователя (user_id) и соответственно выведет 2, вот как сделать что бы 1 ? есть вариант сгрупировать , но что то не выходит, может не так куда то что то пишу ?

5

Re: Вывод имени пользователя по его ID

Попробуйте так:

$sql = "SELECT `u`.`username` AS `username1`, `u2`.`username` AS `username2`, i.image, i.date, i.id
FROM `users` AS `u`
      INNER JOIN (`user_follow` AS `f`, `users` AS `u2`) on (`u`.`id` = `f`.`follow_id` AND `f`.`user_id` = `u2`.`id`)
      LEFT OUTER JOIN images i on f.follow_id = i.user_id
      WHERE
      `f`.`user_id` = 3
GROUP BY `f`.`follow_id`";

6 (изменено: kolxoznik1, 2012-01-24 03:36:23)

Re: Вывод имени пользователя по его ID

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

вот что у меня в бд сейчас сидит :

id => 5, user_id => 3, image => 1_test.jpg
id => 6, user_id => 3, image => 2_test.jpg

Сейчас выводится id=>5 . Подскажите существует ли возможность сделать

ORDER BY id DESC

в

LEFT OUTER JOIN images i on f.follow_id = i.user_id

раз выводит первую фото вхождения user_id поменять ему порядок что бы на 1 позиции стал последний (наибольший) ид с нужной последней фотографией

7 (изменено: kolxoznik1, 2012-01-24 04:31:33)

Re: Вывод имени пользователя по его ID

Ночью интересные вещи можно сделать  smile  вот собственно сделал ORDER BY id DESC в LEFT OUTER JOIN

LEFT OUTER JOIN images i on i.id 
= (SELECT b.id FROM images AS b where f.follow_id = b.user_id ORDER BY b.id DESC LIMIT 1)

выводит последнее изображение пользователя.

Интересно а есть вариант более проще без такого сильного заморачивания ?

8

Re: Вывод имени пользователя по его ID

kolxoznik1 сказал:

Интересно а есть вариант более проще без такого сильного заморачивания ?

Запросом думаю нет. В некоторых случаях два запроса в скрипте сделать проще и эффективнее, чем пытаться сводить все в одном.

9

Re: Вывод имени пользователя по его ID

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

вот что у меня есть в базе сейчас

http://s018.radikal.ru/i513/1201/ea/e3f08667dd7b.jpg

Я пользователь с ID 3

у меня в друзьях : 7,6,8
а у моего друга 6 как и у меня друг 7

должно вывести их всех, а у меня массив где мой друг = 7 замещается на 6 = 7

Array
(
    [0] => Array
        (
            [user_id] => 6
            [follow_id] => the_last.jpg
            [follow_username] => 7
            [follow_date] => 2012-01-24 16:27:35
            [follow_image] => second.jpg
        )

    [1] => Array
        (
            [user_id] => 3
            [follow_id] => ax46l7v7vugnesk10whk_339.jpg
            [follow_username] => 8
            [follow_date] => 2012-01-24 16:15:18
            [follow_image] => fsfsf
        )

    [2] => Array
        (
            [user_id] => 3
            [follow_id] => ax46l7v7vugnesk10whk_339.jpg
            [follow_username] => 6
            [follow_date] => 2012-01-24 16:09:22
            [follow_image] => the_last.jpg
        )

)

как видно не хватает массива

        (
            [user_id] => 3  <<<<---- мой id
            [follow_id] => the_last.jpg
            [follow_username] => 7 <<<< --- мой друг
            [follow_date] => 2012-01-24 16:27:35
            [follow_image] => second.jpg
        )

Если мой друг дружит не смоими друзьями (к примуру с ID = 1) то запрос работает как нужно !
Проблема только если у нас друзья одинаковые, начинает происходить замена...

вот запрос :

$sql = "SELECT u2.id AS user_id, p.image as follow_id, u.id AS follow_username, f.date AS follow_date, i.image as follow_image
        FROM users AS u
        INNER JOIN (user_follow AS f, users AS u2) on (u.id = f.follow_id AND f.user_id = u2.id) 
        LEFT OUTER JOIN images i on i.id = (SELECT b.id FROM images AS b where f.follow_id = b.user_id ORDER BY b.id DESC LIMIT 1)
        LEFT OUTER JOIN images p on p.id = (SELECT b.id FROM images AS b where f.user_id = b.user_id ORDER BY b.id DESC LIMIT 1)
        WHERE f.user_id = 3 OR f.user_id IN (
                                            SELECT f2.follow_id
                                            FROM user_follow f2
                                            where f2.user_id = 3
                                            )
        GROUP BY f.follow_id
        ORDER BY f.date DESC";

Буду крайне признателен за помощь  neutral

10

Re: Вывод имени пользователя по его ID

Я уже запутался, но попробуйте добавить условие группировки.

GROUP BY f.follow_id, f.user_id