LIMIT / OFFSET по столбцу DISTINCT - PullRequest
5 голосов
/ 07 мая 2011

Мне нужно выбрать все сообщения со всеми связанными с ними тегами:

SELECT p.*, pt.name AS tag_name, pt.id AS tag_id FROM posts p
LEFT JOIN posts_tags pt ON pt.post_id = p.id

Итак, я получаю что-то вроде этого:

 p.id | p.name | p.content | tag_name | tag_id
  1   | Yahoo  | ...       | first    | 1
  1   | Yahoo  | ...       | second   | 2
  2   | Google | ...       | second   | 2
  2   | Google | ...       | third    | 3

Я знаю, что при выборе записей таким образом можно получить количество записей, например, через COUNT(p.id), но я не обнаружил, как установить OFFSET (сколько записей пропускается с начала) и LIMIT (сколько записей возвращено вообще) в соответствии с уникальным идентификатором записи .

Теперь это, очевидно, работает таким образом, что пропускает / ограничивает количество записей, но не количество реальных сообщений ...

Ответы [ 2 ]

3 голосов
/ 07 мая 2011

Если я вас правильно понимаю, вы хотите, чтобы все строки тегов для N сообщений начинались со смещения O :

   SELECT p.*, pt.name AS tag_name, pt.id AS tag_id
     FROM (SELECT * FROM posts ORDER BY id ASC LIMIT {N} OFFSET {O}) p
LEFT JOIN posts_tags pt
          ON pt.post_id = p.id

Добавление

Вот один из способов сделать это, используя DENSE_RANK для ограничения только самими сообщениями:

   SELECT p.id, p.name, p.content, pt.name as tag_name, pt.id AS tag_id
     FROM (SELECT DENSE_RANK() OVER (ORDER BY id) AS dr, posts.*
             FROM posts) p
LEFT JOIN posts_tags pt
          ON pt.post_id = p.id
    WHERE dr BETWEEN {N} AND {N + O}
2 голосов
/ 07 мая 2011

Я не очень знаком с PostgreSQL, но (если я правильно понимаю ваш вопрос), я думаю, ROW_NUMBER() - это то место, с которого стоит начать.Примерно так:

SELECT
  Tag_Name, Tag_ID
FROM
  (
  SELECT P.ID, P.Name AS Tag_Name, P.Content, ROW_NUMBER() OVER (ORDER BY P.ID, PT.Tag_ID) AS RowNum
  FROM Posts AS P LEFT JOIN Posts_Tags AS PT ON P.Post_ID = P.ID
  ) AS X
WHERE
  RowNum BETWEEN 101 AND 200

Это должно сработать в MS SQL, вам может потребоваться настроить синтаксис.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...