MySQL - COUNT и извлечение n строк из подзапроса - PullRequest
0 голосов
/ 11 марта 2012

Контекст:

  • У меня есть приложение, которое показывает сообщения и комментарии на главной странице.
  • Я намерен ограничить количество отображаемых сообщений (т. Е. 10 сообщений)и ...
  • Ограничение количества комментариев, отображаемых в одном сообщении (т. е. 2 комментария).
  • Отображение общего количества комментариев в передней части (т. е. «прочитать все 10 комментариев»).)

MySQL:

(SELECT *
 FROM   (SELECT *
         FROM   post
         ORDER  BY post_timestamp DESC
         LIMIT  0, 10) AS p
        JOIN user_profiles
          ON user_id = p.post_author_id
        LEFT JOIN (SELECT *
                   FROM   data
                          JOIN pts
                            ON pts_id = pts_id_fk) AS d
          ON d.data_id = p.data_id_fk
        LEFT JOIN (SELECT *
                   FROM   comment
                          JOIN user_profiles
                            ON user_id = comment_author_id
                   ORDER  BY comment_id ASC) AS c
          ON p.post_id = c.post_id_fk))

Мне не удалось вставить LIMIT и COUNT в этот код, чтобы получить то, что я хочу - какие-либо предложения?- будет рад опубликовать дополнительную информацию, если это необходимо.

Ответы [ 2 ]

0 голосов
/ 11 марта 2012

Это скелет запроса, который вы ищете:

select * from (
  select p1.id from posts p1
  join posts p2 on p1.id <= p2.id
  group by p1.id
  having count(*) <= 3
  order by p1.post_timestamp desc
) p left join (
  select c1.id, c2.post_id from comments c1
  join comments c2 on c1.id <= c2.id and c1.post_id = c2.post_id
  group by c1.id
  having count(*) <= 2
  order by c1.comment_timestamp desc
) c
on p.id = c.post_id

Он будет получать сообщения, упорядоченные по убыванию отметки времени, но только в верхних 3 из них.Этот результат будет объединен с 2 верхними комментариями каждого почтового заказа по убыванию их отметки времени.Просто измените имена столбцов, и это будет работать:)

0 голосов
/ 11 марта 2012

Если я правильно вас понимаю, вы хотите, чтобы не более 10 сообщений (и 2 комментариев) возвращались для каждого уникального пользователя в возвращенном наборе результатов.

Это очень просто в SQLServer / Oracle / Postgre, используя "row_number () PARTITION BY".

К сожалению, в MySql такой функции нет. Подобный вопрос был задан здесь:
ROW_NUMBER () в MySQL

Извините, я не могу предложить более конкретное решение для MySql. Определенно дальнейшее исследование "разделение номера строки по" эквивалентам для MySql.

Суть того, что это делает:

Вы можете добавить набор столбцов, которые составляют уникальный набор, скажем, идентификатор пользователя, например, ради (это «раздел»). Затем в каждую строку, которая соответствует разделу, добавляется столбец «номер строки» и начинается заново. когда это изменится.

Это должно проиллюстрировать:

user_id  row_number
1        1
1        2
1        3
2        1
2        2

Затем вы можете добавить внешний запрос, который говорит: выберите где row_number <= 10, который может использоваться в вашем случае, чтобы ограничить не более 10 сообщений. Использование max row_number для этого пользователя для определения части «прочитать все 10 комментариев». </p>

Удачи!

...