2016-08-28 1 views
5

別のエイリアスを作成するために2つのエイリアスを減算しようとしていますが、「未知の列」エラーが発生しています。他の2つのエイリアスの数学結果を使用してエイリアスを作成する

select o.id, o.name, 
    (select sum(l.source_expense) 
     from `assignments` as a 
     left join `leads` as l on (l.id = a.lead_id) 
     where a.{$this->sql_column}=o.id 
     and l.date_created between {$this->date_from} and {$this->date_to} 
     and find_in_set(l.vertical_id, '".implode(',', $this->app_user->verticals)."') 
    ) as `expense`, 
    (select sum(a.buyer_revenue) 
     from `assignments` as a 
     left join `leads` as l on (l.id = a.lead_id) 
     where a.refunded=0 
     and a.{$this->sql_column}=o.id 
     and l.date_created between {$this->date_from} and {$this->date_to} 
     and find_in_set(l.vertical_id, '".implode(',', $this->app_user->verticals)."') 
    ) as `revenue`, 
    `revenue` - `expense` as `profit` 
    from {$this->sql_table} as o 

基本的に、私はexpenseからrevenueを差し引いてprofitエイリアスを作成したいと思います:

は、ここに私のSQLです。その理由は、私がdatatablesを使用していて、列をソート可能にしたいからです。 PHPでこれを簡単に行うことができます。

どうすればこの問題を解決できますか?

編集 - 私は以下の答えを試してみたが、PHPStormから「それぞれの派生テーブルにエイリアスがある」エラーが発生し、クエリを実行しようとすると構文エラーが発生する。相続人

新しいクエリ:

select t.id, t.name, t.expense, t.revenue, t.revenue - t.expense as profit 
from(select o.id, o.name, 
    (select sum(l.source_expense) 
     from `assignments` as a 
     left join `leads` as l on (l.id = a.lead_id) 
     where a.{$this->sql_column}=o.id 
     and l.date_created between {$this->date_from} and {$this->date_to} 
     and find_in_set(l.vertical_id, '".implode(',', $this->app_user->verticals)."') 
    ) as `expense`, 
    (select sum(a.buyer_revenue) 
     from `assignments` as a 
     left join `leads` as l on (l.id = a.lead_id) 
     where a.refunded=0 
     and a.{$this->sql_column}=o.id 
     and l.date_created between {$this->date_from} and {$this->date_to} 
     and find_in_set(l.vertical_id, '".implode(',', $this->app_user->verticals)."') 
    ) as `revenue` 
    from {$this->sql_table} as o 
) as t 

答えて

1

ちょうど別の選択でそれをラップし、エイリアスは数学的な計算の用途に利用できるようになります:

SELECT t.id,o.name,t.expense,t.revenue, 
     t.revenue -t.expense as `profit` 
FROM (Your Query Here) t 
+0

他の回答と同じですが、エラーが発生しました - "それぞれの派生テーブルには別名が必要です" – kjdion84

+0

@ kjdion84あなたの完全な質問を投稿してください。 – sagi

+0

@ kjdion84あなたは 'O. 'T.Column>の代わりに外側のクエリで(IDと名前)、修正してもう一度やり直してください – sagi

2

あなたは、サブクエリ内でクエリを配置する必要があります。

SELECT 
t.*, 
t.`revenue` - t.`expense` as `profit` 
FROM 
(
select o.id, o.name, 
    (select sum(l.source_expense) 
     from `assignments` as a 
     left join `leads` as l on (l.id = a.lead_id) 
     where a.{$this->sql_column}=o.id 
     and l.date_created between {$this->date_from} and {$this->date_to} 
     and find_in_set(l.vertical_id, '".implode(',', $this->app_user->verticals)."') 
    ) as `expense`, 
    (select sum(a.buyer_revenue) 
     from `assignments` as a 
     left join `leads` as l on (l.id = a.lead_id) 
     where a.refunded=0 
     and a.{$this->sql_column}=o.id 
     and l.date_created between {$this->date_from} and {$this->date_to} 
     and find_in_set(l.vertical_id, '".implode(',', $this->app_user->verticals)."') 
    ) as `revenue` 
    from {$this->sql_table} as o 
) AS t 

注:

あなただけGROUP BY, ORDER BY, or HAVING句で列の別名を使用することができます。

標準SQLを使用すると、 WHERE 句で列の別名を参照することはできません。 WHEREコードが である場合、列の値がまだ決定されていない可能性があるため、この制限は に課されます。

Reference

+0

は、エラーの取得 - 私は「 – kjdion84

+0

「各派生テーブルは別名を持つべきです」エイリアスを使用しました。私が投稿した完全なクエリを試しましたか? @ kjdion84 – 1000111

+0

あなたが提示した意見と引用は 'WHERE'節について言及していますが、OPは' SELECT'文の中で別名を使うことについて尋ねました。 – sagi

関連する問題