seleccione el cálculo para cada fila

Estoy tratando de encontrar una manera de crear un cálculo a partir de los resultados de una consulta de base de datos para proporcionar algún tipo de relevancia.

Aquí hay un ejemplo de mi consulta:

SELECT d.id, MATCH (r.text) AGAINST('sleet snow rain' IN BOOLEAN MODE) as r_matches, s.total_matches
FROM days d
LEFT JOIN condition_days r
    ON (d.id = r.day_id AND MATCH (r.text) AGAINST('sleet snow rain' IN BOOLEAN MODE))
LEFT JOIN (SELECT ss.day_id, COUNT(DISTINCT ss.condition_id) as total_matches FROM conditions ss WHERE ss.condition_id IN (4, 13, 20) GROUP BY ss.day_id) s
ON (s.day_id = d.id)

Que devuelve algo como esto:

+-----+-----------+---------------+
| id  | r_matches | total_matches |
+-----+-----------+---------------+
| 540 |         2 |             5 |
+-----+-----------+---------------+

Entonces mi pregunta es, ¿cómo obtengo un cálculo de los 2 campos calculados (r_matches y total_matches)? Este es un ejemplo de lo que estoy buscando:

+-----+-----------+---------------+----------------------------------------------+
| id  | r_matches | total_matches | total                                        |
+-----+-----------+---------------+----------------------------------------------+
| 540 |         2 |             3 | 5 (calculation of total_matches + r_matches) |
+-----+-----------+---------------+----------------------------------------------+

Entonces, ¿hay alguna forma de obtener un total calculado a partir de 2 campos calculados?

preguntado el 10 de marzo de 12 a las 07:03

2 Respuestas

No se puede ejecutar la prueba sin esquemas, pero algo como esto usando variables temporales debería funcionar bien;

SELECT 
  d.id, 
  @tmp := (MATCH (r.text) AGAINST('sleet snow rain' IN BOOLEAN MODE)) as r_matches, 
  s.total_matches,
  s.total_matches + @tmp AS total
FROM days d
LEFT JOIN condition_days r
  ON (d.id = r.day_id AND MATCH (r.text) AGAINST('sleet snow rain' IN BOOLEAN MODE))
LEFT JOIN (
  SELECT ss.day_id, COUNT(DISTINCT ss.condition_id) as total_matches 
  FROM conditions ss WHERE ss.condition_id IN (4, 13, 20) GROUP BY ss.day_id) s
ON (s.day_id = d.id)

respondido 10 mar '12, 07:03

Podrías usar una tabla derivada:

   select id, r_matches, total_matches, r_matches + total_matches as total
   from (
       select d.id,
              MATCH (r.text) AGAINST('sleet snow rain' IN BOOLEAN MODE) as r_matches,
              s.total_matches as total_matches
       ...
   ) as dt;

El motor de consulta puede ser lo suficientemente inteligente como para calcular la COINCIDENCIA solo una vez, incluso si se menciona dos veces, por lo que el enfoque simple:

select d.id, 
       MATCH (r.text) AGAINST('sleet snow rain' IN BOOLEAN MODE) as r_matches, 
       s.total_matches,
       MATCH (r.text) AGAINST('sleet snow rain' IN BOOLEAN MODE) + s.total_matches as total
...

podría funcionar bien. Sin embargo, no sé si MySQL reconocerá el MATCH duplicado.

respondido 10 mar '12, 07:03

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.