0

content4 つの列を持つコレクションがあります。idtimestamplocationID、およびauthorID。これが私のデータの例です。本番環境では、これは数千万行の長さになります。

id    timestamp              locationID   authorID
1     2012-03-01 11:52:00    1            1
2     2012-03-16 19:56:00    1            2
3     2012-04-02 11:26:00    2            1
4     2012-04-22 11:52:00    2            3
5     2012-05-19 09:48:00    2            2
6     2012-05-30 07:12:00    2            1
7     2012-06-04 19:17:00    1            2

特定authorIDsの. _ _contenttimestamplocationID

のクエリの正しい値は ですlocationID = 2。1[ 1, 3 ]authorID3 は で最近「見られた」のlocationID = 2に対し、authorID2 の最新のコンテンツはlocationID1 でした。

確かに ごとauthorIDに 1 つのクエリを実行できますが、実稼働環境ではauthorID配列の長さが 100,000 を超えています。これは非常に非効率に思えます (特に、各「サブクエリ」がこの数百万行のcontentコレクションにヒットする場合)。私は、理想的にはページ レンダリングで実行されるのに十分な速さで、データセットからこのデータを出現させるより良い方法を探しています。

4

2 に答える 2

1

派生サブクエリを試す

SELECT
    *
FROM content  as c
INNER JOIN(
            SELECT 
                MAX(id) as ID
            FROM content 
            WHERE locationID = 2
            GROUP BY authorID
) as t on t.ID = c.id

SQL フィドルのデモ

于 2013-01-05T04:01:15.087 に答える
1

このようなもの?これは SQL Server のものですが、mySQL でも動作するはずです。

DECLARE @locationId INT
SET @locationId = 2;

SELECT * 
FROM (SELECT AuthorId, Max(TimeStamp) as MaxTimeStamp
    FROM Content C
    WHERE LocationId = @locationId
    GROUP BY AuthorId) AS CBL
    LEFT JOIN Content AS C ON CBL.AuthorId = C.AuthorId
        AND C.TimeStamp > CBL.MaxTimeStamp
WHERE C.AuthorId IS NULL

locationId = 2 の場合、1 と 3 を返します。locationId = 1 の場合は 2 を返します

JW によると (ありがとう!)、正しい mySql アプローチ:

SET @locationId := 2;

SELECT * 
FROM (SELECT AuthorId, Max(TimeStamp) as MaxTimeStamp
    FROM Content C
    WHERE LocationId = @locationId
    GROUP BY AuthorId) AS CBL
    LEFT JOIN Content AS C ON CBL.AuthorId = C.AuthorId
        AND C.TimeStamp > CBL.MaxTimeStamp
WHERE C.AuthorId IS NULL
于 2013-01-05T04:01:51.460 に答える