2011-05-06 47 views
20

Đây là cấu trúc bảng của tôiChọn 20 để cuối bởi tăng dần - PHP/MySQL

MyTable 
ID[P.K][auto increment] TopicID UID Comment 

Bây giờ tôi muốn nhận được 20 lời nhắn cuối cho một TopicID nhưng nó phải được sắp xếp theo thứ tự tăng dần!

[Cũng giống như Facebook theo mặc định cho thấy 20 bình luận cuối cùng chỉ]

Tôi đang tìm kiếm một phiên bản tối ưu hóa, tôi có thể làm điều này với 2/3 truy vấn và mảng php sắp xếp, nhưng tìm kiếm một số lựa chọn tốt hơn

Sample Result with data

MyTable 
ID TopicID UID Comment 
1 1  10 AAAA 
2 1  11 BBBB 
3 1  10 CCCC 
4 1  10 dddd 
5 1  11 EEEE 
6 1  10 FFFF 

tôi muốn để có được 3 kết quả cuối cùng cho một TopicID, kết quả nên

012.351.
4 1  10 dddd 
5 1  11 EEEE 
6 1  10 FFFF 

và không

6 1  10 FFFF 
5 1  11 EEEE 
4 1  10 dddd 
+0

Bạn đang cố sắp xếp trường nào? –

+0

tôi muốn sắp xếp kết quả theo ID tăng dần – Sourav

Trả lời

31

Đầu tiên, chọn 20 mục nhập cuối cùng. Sau đó, sắp xếp chúng theo thứ tự tăng dần. Bạn có thể dễ dàng làm điều này trong một truy vấn duy nhất (với subquery):

select * from (
    select * from your_table order by id desc limit 20 
) tmp order by tmp.id asc 
+0

chính xác những gì tôi đang tìm kiếm, cảm ơn – Sourav

+0

Vui mừng được giúp đỡ;) – binaryLV

+0

Việc sử dụng truy vấn phụ ở đây là không cần thiết. Truy vấn phụ tốn kém và hầu như không cần thiết. Bạn có thể đạt được kết quả tương tự bằng cách chỉ chạy truy vấn con và sau đó in chúng theo thứ tự ngược lại ở phía PHP. – eykanal

0

Tôi thực sự không hiểu ??

Có gì sai với một đơn giản SELECT * FROM MyTable WHERE TopicID = 1 ORDER BY ID ASC LIMIT 20?

Nhân tiện, nếu bạn đang hiển thị những trang được nhập mới nhất (ví dụ: gần đây nhất), bạn sẽ muốn DESC (Giảm dần), không phải ASC. Ngoài ra, việc sử dụng ID là rất không đáng tin cậy, bạn nên có cột DATETIME lưu trữ khi nhận xét đã được nhập.

EDIT: binaryLV's answer sẽ thực hiện việc này một cách chính xác bằng truy vấn phụ. Đó là cùng một truy vấn như của tôi, DESC 'd, và sau đó được sử dụng bởi ID.

+0

Anh ấy cần 20 mục nhập cuối cùng, được sắp xếp theo thứ tự asc.Giống như "5, 6, 7" (thay vì "7, 6, 5") từ "1, 2, 3, 4, 5, 6, 7". – binaryLV

+0

Aahhhh, upvoted câu trả lời của bạn! :-) –

-1

Giả sử ID đó là auto_increment, mà sẽ cho phép bạn sử dụng nó như là một lĩnh vực pseudo-date,

SELECT * FROM MyTable 
    ORDER BY ID DESC 
    LIMIT 20 
+0

Tôi thích ý tưởng sắp xếp theo 'id' (đó là những gì tôi thường làm). Mặc dù, kết quả của truy vấn này sẽ không được sắp xếp khi tác giả cần nó. – binaryLV

0

Bạn cần phải thêm một cột CommentDate và mọi lúc bạn INSERT một sử dụng bình luận NOW() hoặc GETDATE() sau đó sử dụng này chọn:

SELECT Comment FROM MyTable WHERE [email protected] ORDER BY CommentDate DESC, TopicID ASC LIMIT 20 
+0

'TOP (20)'? Trong MySQL? – binaryLV

+0

@binaryLV Rất tiếc bạn. Giới hạn 20 – Danpe

+0

Vâng, nhưng anh ta không cần * mục * đầu tiên. – binaryLV

3
SELECT * 
FROM (
     SELECT * 
     FROM mytable 
     WHERE topicid = $mytopicid 
     ORDER BY 
       id DESC 
     LIMIT 20 
     ) q 
ORDER BY 
     id 

hay, hiệu quả hơn,

(
SELECT * 
FROM mytable 
WHERE topicid = $mytopicid 
ORDER BY 
     id DESC 
LIMIT 20 
) 
ORDER BY 
     id 
1
SELECT * FROM 
    (SELECT * FROM MyTable 
    ORDER BY ID DESC 
    LIMIT 20) ilv 
ORDER BY ID; 
-1

Bạn có thể thử này

SELECT * FROM(
    SELECT TOP 20 * FROM TableName 
    ORDER BY Id DESC 
) 
Naushad ORDER BY Naushad.Id 
+0

Câu hỏi được gắn thẻ MySQL, tập lệnh của bạn sẽ hoạt động với SQL-Server. – bummi

1

Đây phải là biểu thức ngắn nhất để thực hiện công việc:

(select * from your_table order by id desc limit 20) order by id; 
Các vấn đề liên quan