私は現在、次のコードを使用しています。
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が返される結果の2行目にあることがわかるようにする必要があります。次に、2行目より下のすべてを返す必要があります。
サブクエリに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
どの列にも静的な順序がないという事実がなければ、これは問題にはなりません。
何かアドバイスをいただければ幸いです。
ありがとう!