2010-09-13 67 views
5

Giả sử bảng này được sắp xếp theo ngàyChọn Bản ghi liền kề trong Mysql

id  | date  | customer 
3  | 2009-10-01| Frank 
1  | 2010-10-11| Bob 
4  | 2010-11-01| Mitchel 
2  | 2010-11-02| Jim 

Tôi muốn thực hiện một truy vấn để biết ID = 4 các hàng kết quả là

$row[0]['id'] == 1 //previous 
$row[1]['id'] == 4 //most recent/current 
$row[2]['id'] == 2 //next 

Một mysql chỉ giải pháp sẽ là tốt nhất, nhưng nếu có một giải pháp php thanh lịch mà sẽ được mát mẻ là tốt.

+0

là bàn được sắp xếp bởi 'date' cột? Có vẻ như vậy. Vui lòng làm rõ. – shamittomar

+0

'Giả sử bảng này được sắp xếp theo ngày' có, theo ngày, nhưng nếu nó được sắp xếp theo bảng chữ cái tôi giả định giải pháp tương tự – Moak

Trả lời

4

Như bảng được sắp xếp bởi date cột, bạn có thể chạy các truy vấn sau đây để có được nó:

  • Đối với hàng theo thời gian:

    select * from tablename where `date` < (select `date` from tablename where id=4) order by `date` desc limit 1 
    
  • Đối với hàng hiện tại:

    select * from tablename where id=4 
    
  • Đối với hàng tiếp theo:

    select * from tablename where `date` > (select `date` from tablename where id=4) order by `date` asc limit 1 
    

Output: Ba truy vấn trả lại kết quả (từng người một) như sau:

id date  customer 
1 2010-10-11 Bob 
4 2010-11-01 Mitchel 
2 2010-11-02 Jim 
+0

Điều này chắc chắn hoạt động, và có lẽ là cách để chỉ cho ba mục; nếu bạn nghĩ rằng bạn có thể mở rộng đến ví dụ: 5 hồ sơ trước và sau khi kết quả, sau đó điều này sẽ không còn làm việc, và bạn sẽ muốn một cái gì đó tổng quát hơn. – bnaul

0

Chức năng LIMIT có thể mất hai đối số, một bù đắp và một số các hàng cần trả về. Trong trường hợp của bạn, bạn muốn bù đắp (số hàng có ngày trước hàng mong muốn) - 1, hoặc trong trường hợp này là 2 - 1 = 1 và số hàng là ba. Vì vậy, các SQL bạn muốn là

SELECT * FROM customers ORDER BY date ASC LIMIT 1,3; 

và số "1" sẽ là kết quả của truy vấn

SELECT COUNT(*)-1 FROM customers WHERE date > "2010-11-01"; 

Tôi không tin MySQL sẽ cho phép bạn sử dụng một subselect hoặc chức năng giá trị như đối số của LIMIT, vì vậy bạn sẽ phải lưu trữ nó bằng cách sử dụng PHP và xây dựng truy vấn tiếp theo theo cách đó.

1

Vì bạn đang sắp xếp theo ngày, nhưng dựa vào hàng bạn muốn các hàng liền kề trên id, bạn sẽ phải thực hiện 2 truy vấn. Đầu tiên để xác định ngày cho ID bạn đã chọn, thứ hai để có được các hàng liền kề.

Bước 1 - Nhận ngày

Select date 
FROM yourtable 
WHERE id = 4 

Bước 2 - Bắt tất cả các hàng

SELECT * 
FROM yourtable 
WHERE date IN ( (select MAX(date) from yourtable where date < $datefromquery1) 
       , $datefromquery1 
       , (select MIN(date) from yourtable where date > $datefromquery1) 
       ) 
Các vấn đề liên quan