09/10/2018, 23:38

Hỏi câu lệnh SQL??? gấp gấp

- Cần tìm n kết quả mới nhất theo posttime (order by posttime)
- Sắp xếp kết quả theo `hits` của 10 kết quả trên

Các bình thường là lôi 10 kết quả theo posttime rồi dùng php sắp xếp theo hits, nhưng ko chuyên nghiệp với lại server lại mệt công hơn. Bác nào có câu lệnh sql ngắn gọn nào giải quyết vấn đề nầy giùm em.
có thể dùng câu lệnh vòng vèo sellect 2 lần nhưng mà kô ổn vì sẽ tăng thêm phần làm quá tải sql kô ổn!
SELECT * FROM `table` where `id` in ( Select `id` from `table` ORDER BY `posttime` DESC LIMIT 10) order by hits DESC
TheHeTre viết 01:39 ngày 10/10/2018
Hãy thử:
Code:
SELECT *
FROM tableName
ORDER BY postime DESC, hits DESC
LIMIT 10
fanitvn viết 01:49 ngày 10/10/2018
cái nầy đương nhiên em biết, em hỏi nhiều người cũng trả lời như bác, nhưng thực tế, nếu dùng như thế nầy nó sẽ sắp xếp kết quả kiểu ưu tiên, bao h postime trùng nhau thì mới đến hits, cho nên kết quả vẫn là theo posttime....
jiSh@n viết 01:41 ngày 10/10/2018
Quote Được gửi bởi fanitvn View Post
cái nầy đương nhiên em biết, em hỏi nhiều người cũng trả lời như bác, nhưng thực tế, nếu dùng như thế nầy nó sẽ sắp xếp kết quả kiểu ưu tiên, bao h postime trùng nhau thì mới đến hits, cho nên kết quả vẫn là theo posttime....
Query của TheHeTre đưa ra cũng lấy ra 10 cái sx theo posttime, 10 cái này cũng đươc sx theo hits đấy thôi. Đúng theo yêu cầu của bạn rồi còn gì.
tandaica0612 viết 01:40 ngày 10/10/2018
Thử xem thế này có đúng không :
Code:
SELECT *
FROM tableName
ORDER BY postime + hits DESC
LIMIT 10
Làm thế này thì sẽ giảm dần theo posttime và hits
fanitvn viết 01:44 ngày 10/10/2018
Quote Được gửi bởi jiSh@n View Post
Query của TheHeTre đưa ra cũng lấy ra 10 cái sx theo posttime, 10 cái này cũng đươc sx theo hits đấy thôi. Đúng theo yêu cầu của bạn rồi còn gì.
bác thử thì sẽ biết, nó sẽ ưu tiên sắp xếp theo posttime, như em nói nó sẽ xét đến hits chỉ khi postime trùng!!!
fanitvn viết 01:46 ngày 10/10/2018
Quote Được gửi bởi tandaica0612 View Post
Thử xem thế này có đúng không :
Code:
SELECT *
FROM tableName
ORDER BY postime + hits DESC
LIMIT 10
Làm thế này thì sẽ giảm dần theo posttime và hits
để em thử phát nhé, chưa nhìn thấy kiểu nầy bao h, hihi
jiSh@n viết 01:52 ngày 10/10/2018
Quote Được gửi bởi fanitvn View Post
bác thử thì sẽ biết, nó sẽ ưu tiên sắp xếp theo posttime, như em nói nó sẽ xét đến hits chỉ khi postime trùng!!!
Theo tôi hiểu thì yêu cầu của bạn là phải sắp xếp 2 lần, 1 lần để lấy ra 10 posttime, lần còn lại là sắp xếp 10 posttime đó theo hits. Mệnh đề ORDER BY chỉ thực hiện sắp xếp 1 lần thôi (với nhiều điều kiện sx), còn yêu cầu của bạn phải thực hiện đến 2 lần sx

SELECT *
FROM tableName
ORDER BY postime + hits DESC
LIMIT 10
Viết lại rõ ràng và dễ hiểu hơn là
SELECT *, (postime + hits) AS cond
FROM tableName
ORDER BY cond DESC
LIMIT 10
Nếu 1 record có posttime = min(posttime) còn hits đạt giá trị max sao cho max(hits) > max(posttime) thì record đó vẫn được chọn, rõ ràng ko phù hợp với yêu cầu đưa ra. Chưa kể nếu như posstime và hits có kiểu dữ liệu khác nhau thì kết quả sẽ còn sai lệch nữa.
fanitvn viết 01:42 ngày 10/10/2018
SELECT * FROM `table` where `id` in ( Select `id` from `table` ORDER BY `posttime` DESC LIMIT 10) order by hits DESC
xem ra dùng cái nầy vẫn gọn nhất, hok bít có bác nào có cách ngon lành hơn kô?
tandaica0612 viết 01:44 ngày 10/10/2018
Code:
SELECT *
FROM tableName
ORDER BY postime DESC, hits DESC
LIMIT 10
Như mình đoán thì câu lệnh này sẽ là sắp xếp theo posttime rùi mới sắp xếp theo hits
Code:
SELECT *
FROM tableName
ORDER BY hits DESC , postime DESC
LIMIT 10
Còn nếu đổi chỗ 2 cái thì sql sẽ thực hiện sắp xếp theo hits trước rùi mới sắp xếp theo posttime , mình đoán vậy , bạn thử đổi lại như thế này xem xem có đúng không , T_T góp ý một tý thui
----
Quên mất là hình như lệnh order by này chỉ sắp xếp chủ yếu theo biến ban đầu thui thì phải , còn từ biến thứ 2 chở đi là nó chỉ sắp xếp theo các hàng trùng nhau của biến 1, mình nói gì sai mong các bạn giúp đỡ , quả thiệt cũng hơi kém SQL ^^
Bài liên quan
0