2012-03-10 5 views
0

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

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

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

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

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

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

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.

Смежные вопросы