1

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

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

如果不是因为所有列都没有静态顺序,这将不是问题。

任何意见,将不胜感激。

谢谢!

4

2 回答 2

0

我将在此处发布此内容,以供其他寻找类似问题答案的人使用。我最终不得不使用临时表,结果证明它的速度快了大约一半。

我创建了一个临时表,其中包含具有新的、临时的、自动递增的 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 经验的人将能够告诉您这是否适用于所有情况。

于 2012-09-27T15:43:42.147 回答
0

我不认为这会非常有效:

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 ;
于 2012-09-25T23:18:25.600 回答