2013-05-06 2 views
0

Вы знаете, как в домашней ленте Facebook перечислены все последние сообщения? Он показывает пользователя, который опубликовал, их фактическое сообщение, а затем первые несколько комментариев, прикрепленных к этому сообщению. Это то, чего я пытаюсь достичь, но мне сложно создать единый запрос, который может собрать все эти данные.Получить первые несколько комментариев к сообщению из таблицы MySQL

У меня есть 3 стола: Использование, сообщения и комментарии. Каждый из них имеет уникальный идентификатор, но они ссылаются на идентификаторы друг друга. то есть в таблице комментариев есть столбцы для user_id пользователя, который опубликовал, и post_id сообщения, к которому он прикреплен.

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

$query = " 

     SELECT  `posts`.`id`,`posts`.`message`,`posts`.`link`, 
        `posts`.`posted`,`posts`.`category`,`posts`.`user_id`, 
        `users`.`username`, 
        count(`comments`.`id`) 
     FROM  `posts` 
     INNER JOIN `users` 
     ON   `posts`.`user_id`=`users`.`id` 
     JOIN  `comments` 
     ON   `comments`.`post_id`=`posts`.`id` 
     WHERE  `posts`.`group_id` = '$id' 
     AND   `posts`.`category`='$filter' 
     GROUP BY `posts`.`id` 
     ORDER BY `posts`.`posted` 
     DESC 

     "; 

Но вместо того, чтобы найти, как много комментариев пост имеет, я бы вместо того, чтобы как читать первые несколько сообщений. Может ли кто-нибудь подумать о способе достижения этого только одним запросом?

ответ

0

Вы можете использовать опцию LIMIT на "первые" сообщения. Сделав «первые сообщения» подзапросом, а затем присоединившись к комментариям, вы можете получить все в одном запросе. Комментарии должны быть оставлены в случае сообщений без комментариев.

Примечания:

  • Этот запрос не тестировался, но это должно быть близко.

  • Это будет все комментарии для первых нескольких сообщений, поэтому вам нужно ограничить отображение «максимум 3 комментария за сообщение», используя внешний код дисплея.

  • Возможно, возможно ограничить комментарии до 3 за сообщение в этом запросе с помощью переменных, но это не то, что я знаю, как это сделать.

Вот запрос:

SELECT 
    FirstPosts.id, 
    FirstPosts.message, 
    FirstPosts.link, 
    FirstPosts.posted, 
    FirstPosts.posts, 
    FirstPosts.user_id, 
    FirstPosts.username, 
    comments.<< your comment column >> 
FROM (
    SELECT  `posts`.`id`,`posts`.`message`,`posts`.`link`, 
       `posts`.`posted`,`posts`.`category`,`posts`.`user_id`, 
       `users`.`username` 
     FROM  `posts` 
     INNER JOIN `users` 
     ON   `posts`.`user_id`=`users`.`id` 
     WHERE  `posts`.`group_id` = '$id' 
     AND   `posts`.`category`='$filter' 
     ORDER BY `posts`.`posted` DESC 
     LIMIT 20) FirstPosts 
    LEFT JOIN comments ON FirstPosts.id = comments.post_id 
ORDER BY FirstPosts.Posted, comments.<< column you use to determing comment order >> 

Если вы определяете комментарий порядка по дате или последовательности, вы должны будете ORDER BY FirstPosts.Posted, comments.whatever DESC.

Надеюсь, это поможет!

+0

Спасибо за ответ. Я действительно использую mysqli. Кроме того, мой вопрос заключается не в том, как ограничить мои результаты, а на самом деле, как получить результаты. Если на моей странице будет 20 сообщений, я не хочу запускать 20 запросов, чтобы возвращать комментарии, я бы хотел получить все почтовые данные и первые 3 комментария в этом одном запросе. Я предполагаю, что это означало бы, что MySQL вернет массив INSIDE строки, если он сможет это сделать. – user1537360

+0

Извините, я неправильно понял этот. Я обновлю свой ответ, но заметьте, что (а) запрос будет непроверенным и (б) он получит * все * комментарии для первых 20 сообщений, поэтому вам придется отсеять что-либо за пределами первых трех, используя фронт -end PHP-код. –

+0

haha ​​должен признать, что это сломало мой мозг некоторое время (я довольно новичок в MySQL). Думаю, я обнял его, хотя и сделал некоторые хитрости здесь и там, и он делает эту работу. Благодаря! – user1537360

Смежные вопросы