Запустите несколько запросов, а затем отобразите их на основе взвешенной важности, такой как Facebook Wall - PullRequest
1 голос
/ 30 марта 2011

Я создаю сайт социальной сети для клиента, и меня беспокоит то, как я буду отображать обновления статуса, новые записи в блогах, комментарии в профилях и т. Д. На своей «стене».Проблема не в запросе базы данных и отображении информации ... она отображает всю информацию в 1 запросе.Например, допустим, у меня есть следующие таблицы:

Members, 
MemberComment, 
Statuses, 
Articles

Я знаю, что могу отображать статусы участников в одном запросе, например:

SELECT * FROM status WHERE who = '$profileid' ORDER BY ID DESC

И затем я могу отображать комментарии, подобные этому:

SELECT * FROM member_comments WHERE which = '$profileid' ORDER BY ID DESC

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

Как я могу отобразить эту информацию так, чтобы она сортировалась по дате публикации или уровню важности?Я не знаю, как сжать все запросы в один, и, кроме того, иметь возможность правильно отображать их в цикле while.

Ответы [ 4 ]

0 голосов
/ 01 апреля 2011

Это то, чем я закончил, и пока все работает отлично.Он возвращает как комментарии, так и статусы и упорядочивает их по дате публикации ...

    SELECT
    member_comments.what AS commentWHAT,
    member_comments.who AS commentWHO,
    member_comments.when AS commentWHEN,
    members.name AS commentNAME
    FROM member_comments, members
    WHERE member_comments.who = members.id AND 
    member_comments.which = '$id'
    UNION
    SELECT
    status.what AS statusWHAT,
    status.who AS statusWHO,
    status.when AS statusWHEN,
    members.name AS statusNAME
    FROM status, members
    WHERE status.who = '$id' AND members.id = '$id'
    ORDER BY commentWHEN DESC

Затем выводим данные следующим образом:

            while ($row = mysql_fetch_array($result)) {
            $message = $row['commentWHAT'];
            $commentWHO = $row['commentWHO'];
            $commentNAME = $row['commentNAME'];
            $statusWHO = $row['statusWHO'];

            echo '
            <div class="fairway_thing">
                <img src="images/avatar-60.jpg">
                <p><strong><a href=profile.php?uid=' . $commentWHO . '>' . $commentNAME .'</a></strong> ' . $message . '</p>
                <p><a href="#">Like</a> <a href="#">Tweet</a> <a href="#">Share</a></p>
            </div>
            <div class="clear"></div>
            ';
0 голосов
/ 30 марта 2011

Если вы используете MySQL, я бы использовал функцию GROUP_CONCAT, чтобы получить всех ваших детей и поместить их в одну строку для родителя в новом столбце. Затем вы можете проанализировать это поле на стороне сервера, чтобы показать каждый результат в отдельности.

См .: http://dev.mysql.com/doc/refman/4.1/en/group-by-functions.html#function_group-concat

0 голосов
/ 30 марта 2011

Если у вас есть какое-то сходство между различными таблицами и какое-то представление о том, как справляться с релевантностью, вы можете использовать оператор UNION.Это как волшебство!

Пример запроса:

select title, 
    date, 
    100 as importance
from memberComment
where originalPostMemberID = $currentUserID
union
select title, 
  date, 
  1000 as importance
from statuses
where (some way of working out visibility of the status request)
union 
select title, 
  date, 
  1010 as importance
from articles
where (some way of working out visibility of the status request)
order by date desc, importance
0 голосов
/ 30 марта 2011

Один пример статуса участника

select member.*, status.* from member m
  inner join status s on m.member_id = s.who 
order by s.ID desc limit 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...