MySQL:订单后是否返回X ID以下的行?

MySQL:订单后是否返回X ID以下的行?,mysql,Mysql,我目前正在使用以下代码: SELECT at.article_id, art.datetime, Count(at.article_id) AS common_tagged_art FROM article_tags AS at INNER JOIN articles AS art ON at.article_id = art.article_id WHERE at.tag_id = 4 OR at.tag_id = 3 OR at.tag_id = 1 GROUP BY at.article_

我目前正在使用以下代码:

SELECT at.article_id, art.datetime, Count(at.article_id) AS common_tagged_art
FROM article_tags AS at INNER JOIN articles AS art ON at.article_id = art.article_id
WHERE at.tag_id = 4 OR at.tag_id = 3 OR at.tag_id = 1
GROUP BY at.article_id
ORDER BY common_tagged_art DESC, art.datetime DESC
这将返回我所需的几乎完全相同的结果集,如下所示:

+-----------+---------------------+-------------+
| article_id| datetime            | common_tags |
+-----------+---------------------+-------------+
|     23    | 2012-09-25 15:37:25 |      3      |
+-----------+---------------------+-------------+
|     24    | 2012-09-25 15:37:24 |      3      |
+-----------+---------------------+-------------+
|     27    | 2012-09-25 15:37:23 |      3      |
+-----------+---------------------+-------------+
|     30    | 2012-09-25 15:37:22 |      3      |
+-----------+---------------------+-------------+
|     21    | 2012-09-25 15:37:21 |      3      |
+-----------+---------------------+-------------+
我需要调整我的查询,以便我能够确定article_id 24位于我返回的结果的第二行,然后我需要它返回第二行下面的所有内容

如果子查询中有100行,并且我确定article_id 24位于第49行,那么我需要查询返回第50-100行。我不确定这在MySQL中是否可行,或者在给定原始查询的情况下,它是否更适合在PHP中执行

到目前为止,我所拥有的看起来像下面这样,只是,在子查询之后我不知所措

SELECT article_id, datetime, common_tags
FROM (
  SELECT at.article_id, art.datetime, Count(at.article_id) AS common_tags
  FROM article_tags AS at INNER JOIN articles AS art ON at.article_id = art.article_id
  WHERE at.tag_id IN (4,3,1)
  GROUP BY at.article_id
  ORDER BY common_tags DESC, art.datetime DESC
) at1
//IDENTIFY which row article_id X is on in at1
//GET any row below row X in at1
如果不是因为所有列都没有静态顺序,这就不会成为问题

如有任何建议,将不胜感激


谢谢

我不认为这是非常有效的:

SELECT at.article_id
     , art.datetime
     , COUNT(at.article_id) AS common_tagged_art
FROM article_tags AS at 
  INNER JOIN articles AS art 
    ON at.article_id = art.article_id
WHERE at.tag_id IN (4, 3, 1)
  AND at.article_id <> 23                         --- parameter: 23
GROUP BY at.article_id
HAVING (COUNT(at.article_id), art.datetime) <=
       ( SELECT COUNT(at2.article_id), art2.datetime
         FROM article_tags AS at2
           INNER JOIN articles AS art2 
             ON at2.article_id = art2.article_id
         WHERE at2.tag_id IN (4, 3, 1)
           AND at2.article_id = 23                 --- parameter: 23
       )
ORDER BY common_tagged_art DESC
       , art.datetime DESC ;

我将把这篇文章贴在这里,供任何想找到类似问题答案的人参考。最后我不得不使用临时表,结果证明,临时表的速度快了一半左右

我创建了一个临时表,其中包含所有带有新的、临时的、自动递增ID的结果,以便使用>操作符

CREATE TEMPORARY TABLE at_results (
id INTEGER(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,
article_id INTEGER(10) NOT NULL,
datetime DATETIME NOT NULL,
common_tags INTEGER NOT NULL)
SELECT at.article_id, art.datetime, Count(at.article_id) AS common_tags
FROM article_tags AS at 
INNER JOIN articles AS art ON at.article_id = art.article_id
WHERE at.tag_id IN (4,3,1)
GROUP BY at.article_id
ORDER BY common_tags DESC, art.datetime DESC;
然后,我创建了另一个临时表,其中只包含临时表中所需文章的id。这是在另一个表中,因为我发现MySQL不允许您多次引用临时表。这是一个已知的错误

CREATE TEMPORARY TABLE results_article
SELECT id
FROM at_results
WHERE article_id = 23;
然后我就拉任何一篇AI id高于目标文章的文章

SELECT at_results.id,article_id, datetime, common_tags
FROM at_results, at_article
WHERE at_results.id > results_article.id
这将返回我想要的确切结果。我希望这对其他人有帮助。由于我对MySQL不是很精通,所以我花了一点时间才勉强读完


作为说明,我不完全确定这是否是最有效的方法。据我所知,它相当快。有更多SQL经验的人可以告诉您,这是否适用于所有情况。

非常感谢您的回答。我可能没有正确理解这一点,但是这个解决方案似乎为我返回了除指定行之外的所有内容。如果我把23换成其他数字,它几乎会返回除23以外的所有数字。我发现我想做的事情很难用语言表达出来,所以对此我很抱歉。更具体地说,我想做的是计算我第一次查询的所有行,找到新计数中的article_id 23行,并在启用article_id 23行后返回所有行。测试时,您是否在两个位置都更改了23行?是的。我在这两个字段中搜索哪篇文章似乎无关紧要,它似乎只是删除了一行。我将在指定参数之前和之后获得结果。这是否更适合创建临时表?我想用PHP对结果进行排序,但这可能会返回大量结果。你能再次检查更新吗?常见的别名可能会让解析器感到困惑。我只是再次尝试,结果略有不同。我似乎无法确定它返回的结果模式,但它没有返回正确的数据。实际上,我只是使用临时表解决了这个问题。我会发布我的解决方案。谢谢你的帮助!我想给你投票,但我对这个网站太陌生了,不能这么做。