2012-07-04 51 views
5

Tôi đang cố đặt một bảng theo hai cột, mỗi cột có trọng số khác nhau. Đầu tiên là uptime, giá trị nằm trong khoảng từ 0 đến 1 và có trọng số là 0,3. Thứ hai là votes, là số nguyên không âm và có trọng số là 0,7.Sử dụng giá trị cột tối đa theo thứ tự

Trọng số cần được nhân với giá trị từ 0-1, vì vậy tôi sẽ nhận được số phiếu này bằng cách chia số phiếu cho mỗi hàng theo số phiếu bầu tối đa được giữ bởi bất kỳ hàng nào.

Đây là câu hỏi của tôi cho đến nay, và nó hầu như hoạt động:

SELECT addr 
    FROM servers 
    ORDER BY (0.3 * uptime) + 
      (0.7 * (votes/100)) DESC 

100 được mã hóa cứng và nên được giá trị tối đa votes. Sử dụng MAX(votes) làm cho truy vấn chỉ trả về bản ghi có số phiếu bầu cao nhất. Điều này có thể được thực hiện trong một truy vấn không?

Trả lời

2

Bạn có thể sử dụng một subquery để lựa chọn giá trị lớn nhất của votes

SELECT addr 
    FROM servers 
    ORDER BY (0.3 * uptime) + 
      (0.7 * (votes/(SELECT MAX(votes) FROM servers))) DESC 

Ví dụ fiddle here.

+0

Tôi nghĩ rằng anh ấy muốn thay thế '100' bởi 'cái MAX (phiếu)', và không phải 'phiếu bầu' cho 'MAX (phiếu bầu)'. –

+0

@aF. Cảm ơn - đã sửa lỗi đó. – Sirko

+0

Tôi không hiểu tại sao, nhưng trên db của tôi, điều này chỉ trả lại hàng duy nhất có nhiều phiếu nhất. Tôi thậm chí đã thử nó từ phpmyadmin. Collation có quan trọng không? – Matt

2

Định nghĩa một biến và sử dụng nó:

DECLARE @maxVotes int 
SELECT @maxVotes = MAX(votes) from servers 

SELECT addr 
    FROM servers 
    ORDER BY (0.3 * uptime) + 
      (0.7 * (votes/@maxVotes)) DESC 

hoặc sử dụng một subquery trong order by:

SELECT addr 
    FROM servers 
    ORDER BY (0.3 * uptime) + 
      (0.7 * (votes/(SELECT MAX(votes) FROM servers))) DESC 
Các vấn đề liên quan