2017-07-01 66 views
0

我有我使用PostgreSQL的CTE(公共表表达式)功能的查询:如何与一个PostgreSQL CTE查询返回查询生成器

WITH tmp_users AS (
    SELECT users.id, users.name, users.email, users.created_at,sum(transactions.amount) as credit 
    FROM users INNER JOIN transactions 
    ON users.id = transactions.user_id 
GROUP BY users.id,users.name,users.email, users.created_at, transactions.user_id 
) 
SELECT * FROM tmp_users WHERE credit > 100; 

我能实现这个结果:

$result = DB::select("WITH tmp_users AS (
    SELECT users.id, users.name, users.email, users.created_at,sum(transactions.amount) as credit 
    FROM users INNER JOIN transactions 
    ON users.id = transactions.user_id 
GROUP BY users.id,users.name,users.email, users.created_at, transactions.user_id 
) SELECT * FROM tmp_users WHERE credit > 100"); 

但我需要查询生成器不仅结果。

任何帮助将不胜感激。

P.S:

为什么我使用Postgres的CTE功能?

因为在PostgreSQL中,如果我想在别名字段上做任何语句,我需要使用CTE功能(Read more)。

+1

您可以使用子查询得到同样的结果(具有更好的性能)和'然后从*'。 – wildplasser

+0

我在上面的查询中添加了一个地方。现在,我可以通过使用子查询来获得相同的结果吗? –

+0

是的,当然。 – wildplasser

回答

1
SELECT * FROM 
(
    SELECT u.id, u.name, u.email, u.created_at 
    ,sum(t.amount) as credit 
    FROM users u 
    INNER JOIN transactions t ON u.id = t.user_id 
    GROUP BY u.id, u.name, u.email , u.created_at -- , t.user_id 
) tmp_users 
WHERE credit > 100; 
0

感谢到@wildplasser

$query = DB::table('users') 
     ->select('*') 
     ->from(DB::raw(
     '(SELECT u.id, u.name, u.created_at, sum(transactions.amount) as credit 
     FROM users as u INNER JOIN transactions as t ON u.id = t.user_id 
     GROUP BY u.id,u.name,u.created_at,t.user_id) as tmp_users' 
    ));