Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 按不同列限制/偏移_Sql_Database_Postgresql - Fatal编程技术网

Sql 按不同列限制/偏移

Sql 按不同列限制/偏移,sql,database,postgresql,Sql,Database,Postgresql,我需要选择所有贴子及其相关标签: 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 | ...

我需要选择所有贴子及其相关标签:

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
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
我知道当以这种方式选择记录时,可以通过
计数(p.id)
获得记录数,但我没有发现如何根据唯一的post id设置
偏移量(从开始跳过的记录数)和
限制(返回的记录数)


现在它显然是在这样工作,它跳过/限制了记录的数量,但没有限制真实帖子的数量…

如果我理解正确,您希望N篇帖子的所有“标记”行从偏移量O开始:

附录

这里有一种方法,使用
densite\u-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}

我对PostgreSQL不是很熟悉,但是(如果我正确理解你的问题的话)我认为
ROW\u NUMBER()
是正确的起点。大概是这样的:

 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
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中应该可以做到,您可能需要调整语法。

UpVorters,您是否尝试过运行此查询?解析函数是个好主意,但ROW_NUMBER()给出了OP不想要的确切行为。此外,列投影不完整(两列而不是五列),并且PT.Tag_Id除了作为OP数据集中的别名外不存在。首先,非常感谢您提供的非常有用的答案。快速提问:{N}和{N+O}之间的
是否等于{offset}和{limit}之间的
吗?
0
基于偏移和限制的偏移应该是{offset}+1和{offset}+{limit}