1 (изменено: kolxoznik1, 2012-02-10 05:44:24)

Тема: Запрос связывающий три таблицы

Столкнулся с такой вот проблемой, до этого не выводил разное содержимое на одну страницу с разнымы хтмл блоками.
Вот решил создать страничку с пользовательской деятельностью и вывести все в таком виде :

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

А
А
А
Б

или

А
Б

Все зависит от колличества записей в таблице.

Я решил связать данные таблицы :

users
id
username

images
id
user_id
image
description
date

user_favorites
id
user_id
image_id
date

и получил такой вот запрос :

        $sql = "SELECT 
                    u.username as user, 
                    p.image as user_image, 
                    i.image as uploaded_image, 
                    i.id as image_id, 
                    i.description as text, 
                    UNIX_TIMESTAMP(i.date) as image_date, 
                    COALESCE ( imgcount.cnt, 0 ) as comments,
                    fav.id as favorite_id,
                    r.image as favorited_image,
                    u2.username as favorite_user,
                    t.image as favorite_user_image                                                            
                FROM users u
                LEFT JOIN images i ON i.user_id = u.id
                LEFT JOIN images p ON p.id = (SELECT b.id FROM images AS b where u.id = b.user_id ORDER BY b.id DESC LIMIT 1)
                LEFT JOIN (SELECT image_id, COUNT(*) as cnt FROM commentaries GROUP BY image_id  ) imgcount ON i.id = imgcount.image_id
                
                LEFT JOIN user_favorites fav ON fav.user_id = u.id                
                LEFT JOIN images r ON r.id = fav.image_id
                LEFT JOIN users u2 ON u2.id = r.user_id                                
                LEFT JOIN images t ON t.id = (SELECT b.id FROM images AS b where u2.id = b.user_id ORDER BY b.id DESC LIMIT 1)                                                                
                
                WHERE i.user_id = ?
                ";

и он выводит :

    [everything_list] => Array
        (
            [0] => Array
                (
                    [user] => 8888
                    [user_image] => http://127.0.0.1/auth_system_1/upload_images/24/24_0j1kjjzdv3ez07a0ee4lnmjb7_163.jpeg
                    [uploaded_image] => http://127.0.0.1/auth_system_1/upload_images/224/224_0j1kjjzdv3ez07a0ee4lnmjb7_163.jpeg
                    [image_id] => 4
                    [text] => 
                    [image_date] => 1328577934
                    [comments] => 0
                    [favorite_id] => 2
                    [favorited_image] => http://127.0.0.1/auth_system_1/upload_images/100/100_0j1kjjzdv3ez07a0ee4lnmjb7_163.jpeg
                    [favorite_user] => 8888
                    [favorite_user_image] => http://127.0.0.1/auth_system_1/upload_images/24/24_0j1kjjzdv3ez07a0ee4lnmjb7_163.jpeg
                )

            [1] => Array
                (
                    [user] => 8888
                    [user_image] => http://127.0.0.1/auth_system_1/upload_images/24/24_0j1kjjzdv3ez07a0ee4lnmjb7_163.jpeg
                    [uploaded_image] => http://127.0.0.1/auth_system_1/upload_images/224/224_0j1kjjzdv3ez07a0ee4lnmjb7_163.jpeg
                    [image_id] => 4
                    [text] => 
                    [image_date] => 1328577934
                    [comments] => 0
                    [favorite_id] => 5
                    [favorited_image] => http://127.0.0.1/auth_system_1/upload_images/100/100_flw3utn9igiqh7dtt2o61ydf8_174.jpeg
                    [favorite_user] => 6666
                    [favorite_user_image] => http://127.0.0.1/auth_system_1/upload_images/24/24_flw3utn9igiqh7dtt2o61ydf8_174.jpeg
                )

        )

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

Далее выводя через foreach в html выводится тоже блоки на колличеству строк.

Вот решил спросить на правильном ли я пути делая данную страницу активности использовать 1 запрос ?
Возможно ли будет добиться результата вывода "фаворитов" и "изображений" и отобрать в виде "Ф", "И" , "Ф" не дублируя хтмл блоки?

Просто не зная до конца как сделать я еще сомневаюсь на правильном ли я пути ? hmm

2

Re: Запрос связывающий три таблицы

Могу только посоветовать в phpMyAdmin перед SELECT поставить EXPLAIN, чтобы посмотреть что стоит MySQL такой запрос.
http://dev.mysql.com/doc/refman/5.5/en/ … utput.html

Попробуйте сделать альтернативу на обычных запросах.

3

Re: Запрос связывающий три таблицы

альтернатива если я правильно понимаю есть, у меян есть страница где выводятся фавориты пользователя, на другой изображения пользователя, они работают, запросы к ним есть. По идеи осталось взять эти 2 запроса и вывести на страницу - активность, но если делать навигацию постраничную мне нужен будет 1 запрос  neutral  все равно какой то тупик. Хотя даже если получится запрос такой сделать, лучше чем сейчас думаю нельзя , а при таком варианте при выводе данные дублироваться будут или покрайней мере хтмл блоки что будут в foreach . Просто вот интересно как на многих сайтах данный функционал делают, хочется услышать совет человека кто может такое делал уже smile

4

Re: Запрос связывающий три таблицы

kolxoznik1 сказал:

но если делать навигацию постраничную мне нужен будет 1 запрос

Если считать строки сгруппированные по пользователю, то разбить страницы будет не сложно.

Попробуйте найти в сети скрипт с похожей реализацией и посмотрите его код. Думаю там все будет значительно проще, чем у вас получилось. К сожалению, я не могу помочь.