2012-07-04 19 views
5

Estoy tratando de ordenar una tabla por dos columnas, cada una con una ponderación diferente. El primero es uptime, que tiene un valor entre 0 y 1 y tiene una ponderación de 0.3. El segundo es votes, que es un número entero no negativo y tiene una ponderación de 0.7.Usar el valor máximo de la columna en orden por

La ponderación se debe multiplicar por un valor entre 0-1, por lo que voy a obtener este para los votos dividiendo el número de votos para cada fila por el número máximo de votos en cada fila.

Ésta es mi consulta hasta el momento, y casi funciona:

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

El 100 es codificada y debe ser el valor máximo de votes. El uso de MAX(votes) hace que la consulta devuelva solo el registro con el mayor número de votos. ¿Se puede hacer esto en una sola consulta?

Respuesta

2

se puede utilizar una subconsulta para seleccionar el valor máximo de votes

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

Ejemplo violín here.

+0

Creo que quiere reemplazar '' 100' por los MAX (votos) ', y no 'votos' para' MAX (votos) '. –

+0

@aF. Gracias - corrigió ese error. – Sirko

+0

No entiendo por qué, pero en mi base de datos esto solo devuelve la única fila con la mayor cantidad de votos. Incluso lo probé de phpmyadmin. ¿La colación importa? – Matt

2

definir una variable y lo utilizan:

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

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

o utilizar una subconsulta en la order by:

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