2012-07-05 33 views
7

Tôi có bảng chứa nhận xét của người dùng và tôi muốn truy xuất nhận xét cuối cùng được thực hiện bởi mỗi người dùng.nhận dữ liệu từ mối quan hệ nhiều đến nhiều số

Query dưới đây sẽ cung cấp cho u một ý tưởng về những gì tôi đang cố gắng để làm

select comment, comment_id, userId FROM comments_table 
WHERE comment_id in (
    SELECT MAX(comment_id) 
    FROM comments_table where userId in (2001, 2002, 2010) 
    GROUP BY userId 
) 

Trên công trình truy vấn nhưng mất nhiều thời gian đặc biệt là nếu có nhiều userIds.

Tôi cần một tuyên bố truy vấn nhanh hơn hoàn thành cùng một điều.

Trả lời

9

Sử dụng tham gia thay vì một subquery:

SELECT 
    b.* 
FROM 
    (
     SELECT userid, MAX(comment_id) AS maxcomment 
     FROM comments_table 
     WHERE userid IN (2001, 2002, 2010) 
     GROUP BY userid 
    ) a 
INNER JOIN 
    comments_table b ON 
     a.userid = b.userid AND 
     a.maxcomment = b.comment_id 

Tiểu chọn trong truy vấn này sẽ chỉ thực hiện một lần, như trái ngược với một subquery WHERE IN mà sẽ thực hiện cho mỗi hàng trong bảng bình luận.

+0

giảm thời gian truy vấn từ 1 giây xuống 0,0026. cảm ơn – user1502826

+0

tôi cần thêm gì vào truy vấn ở trên nếu có một bảng khác gọi là user_details là u mà tôi cũng muốn trích xuất các cột u.mainimage và u.fullname có thể sử dụng b.user_id = u.user_id – user1502826

+0

Bảng 'user_details' sẽ có gì kết nối liên kết tới? Bảng bình luận? Bảng người dùng? –

0

Hãy thử với

  select comment, comment_id, userId FROM   comments_table WHERE userId in (2001, 2002, 2010) order by comment_id desc limit 1 

Hãy thử và xem nếu truy vấn này là tương đương với bạn Với một chỉ mục trên cột userid, điều này sẽ thực hiện hơn khá

+0

Điều này sẽ chỉ lấy một hàng: * nhận xét gần đây nhất được tạo từ bất kỳ người dùng nào trong số ba người dùng *. O.P. đang yêu cầu nhận xét gần đây nhất được thực hiện bởi *** mỗi *** trong ba người dùng, điều đó có nghĩa là bạn phải thực hiện tối đa nhóm cho các nhận xét do mỗi người dùng đưa ra. –

0

Hãy giữ nó đơn giản:

SELECT comment, MAX(comment_id), userId 
FROM comments_table 
WHERE userId IN (2001, 2002, 2010) 
GROUP BY userId; 
+0

Giải pháp này sẽ kéo 'comment_id' gần đây nhất trên' userid', nhưng trường 'comment' sẽ không đúng trong thư từ với' comment_id'. –

Các vấn đề liên quan