выберите расчет для каждой строки - PullRequest
0 голосов
/ 10 марта 2012

Я пытаюсь найти способ создать вычисление из результатов запроса к базе данных, чтобы обеспечить своего рода релевантность.

Вот пример моего запроса:

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)

Что возвращает что-то вроде этого:

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

Итак, мой вопрос, как мне получить вычисление из 2 вычисляемых полей (r_matches и total_matches)?Это пример того, что я ищу:

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

Так есть ли способ получить вычисленную сумму из 2 вычисляемых полей?

Ответы [ 2 ]

2 голосов
/ 10 марта 2012

Невозможно выполнить тест без схем, но что-то вроде этого с использованием временных переменных должно работать нормально;

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)
0 голосов
/ 10 марта 2012

Вы можете использовать производную таблицу:

   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;

Механизм запросов может быть достаточно умен, чтобы вычислять MATCH только один раз, даже если он упоминается дважды, поэтому простой подход:

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
...

может работать просто отлично.Я не знаю, распознает ли MySQL дубликат MATCH.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...