2012-09-01 24 views
6

Tôi có một bảng với một sơ đồ sau:MySQL - cho mỗi ID trong danh sách chọn 2 yếu tố cuối cùng

id, field, time 
3, 'test0', 2012-08-29 
3, 'test1', 2012-08-30 
3, 'test2', 2012-08-31 
2, 'test0', 2012-08-19 
2, 'test1', 2012-08-20 
2, 'test2', 2012-08-26 
... 

Tôi cần cho mỗi id trong danh sách tìm thấy nó là cuối cùng và trước đến giá trị cuối cùng. Ví dụ, nếu id = [2,3] kết quả sẽ trả về

3, 'test1', 2012-08-30 
3, 'test2', 2012-08-31 
2, 'test1', 2012-08-20 
2, 'test2', 2012-08-26 

Nếu tôi sẽ chỉ cần giá trị cuối cùng, tôi sẽ sử dụng

SELECT * 
FROM table 
WHERE id IN (2, 3) 
GROUP BY id 

Bất kỳ ý tưởng làm thế nào tôi có thể đạt được điều này?

+0

Nhóm theo sẽ cho một kết quả duy nhất cho tất cả các id. – hjpotter92

+0

bạn có thể khai thác 'SORT' trên cột thời gian được kết hợp với mệnh đề' LIMIT'. –

Trả lời

3

Nếu thời gian của bạn cho mỗi số id là duy nhất, điều này sẽ làm việc.

SELECT d.id, d.field,d.time 
    FROM d d 
    JOIN (
    SELECT max(d.time)m, d.id 
     FROM d 
     JOIN (
     SELECT max(time) m, id 
      FROM d 
     GROUP BY id 
    )e ON d.id=e.id AND e.m>d.time 
     GROUP BY d.id 
    )e ON d.time >= e.m AND d.id = e.id 

Đây là cách hoạt động. Truy vấn lồng nhau này nhận thời gian mới nhất cho mỗi id.

  SELECT max(time) m, id 
      FROM d 
     GROUP BY id 

Sau đó, lần lượt này được lồng vào truy vấn này, mang đến cho bạn lần thứ hai-to-mới nhất cho mỗi id (thời điểm gần nhất của tập hợp con của hàng mà loại trừ thời gian rất gần nhất).

SELECT max(d.time)m, d.id 
     FROM d 
     JOIN (
     SELECT max(time) m, id 
      FROM d 
     GROUP BY id 
    )e ON d.id=e.id AND e.m > d.time 

Cuối cùng, truy vấn đầy đủ (được hiển thị đầu tiên ở trên) nhận tất cả các hàng có thời gian lớn hơn hoặc bằng thời gian mới thứ hai.

Nếu thời gian của bạn không phải là duy nhất - tức là bạn có một số hàng có ID và thời gian giống nhau xuất hiện, bạn có thể nhận được nhiều hơn hai hàng cho mỗi ID. Nhưng bạn sẽ luôn nhận được hai lần mới nhất.

Nếu một ID cụ thể chỉ có một hàng, bạn sẽ không nhận được nó.

Chỉ bạn mới biết những giới hạn đó có được chấp nhận hay không.

Biến thành công! http://sqlfiddle.com/#!2/82719/5/0

1

này cung cấp cho một thử

SELECT * 
    FROM table 
    WHERE id = '1' 
    ORDER BY `id` desc 
    LIMIT 0,2 
UNION 
    SELECT * 
    FROM table 
    WHERE id = '2' 
    ORDER BY `id` desc 
    LIMIT 0,2 

UPDATE:

Nếu cũng có thể thử một cái gì đó như thế này:

SELECT t1.* 
FROM `tablename` t1 
LEFT OUTER JOIN `tablename` t2 
    ON (t1.id = t2.id AND t1.time > t2.time) 
GROUP BY t1.id, t1.field, c1.time 
HAVING COUNT(*) < 2; 

Reference

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