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

그래서 내 질문입니다, 내가 (r_matches를 2 개 계산 된 필드의 계산을 얻는 방법과 total_matches)? 이의 예입니다 내가 무엇을 찾고 :

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

그래서이 개 계산 된 필드에서 계산 된 총을 얻을 수있는 방법이 있나요?

답변

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를 인식 할 수 있는지 모르겠습니다.

관련 문제