2012-03-10 15 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つの計算フィールドから計算された合計を取得する方法はありますか?

答えて

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

あなたは、派生テーブルを使用できます。

:クエリエンジンが唯一のそれはシンプル志向のアプローチので二回言及されている場合でも、一度MATCHを計算するために十分にスマートであるかもしれない

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; 

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を認識するかどうかわかりません。