[英]Selecting data from database with sql
i have a sql sub-select to list how many orders there are and their total value: 我有一个sql子选择来列出有多少个订单及其总价值:
SELECT u.name,
(SELECT COUNT(*) FROM orders o WHERE o.user_id=u.id
) AS order_count,
(SELECT SUM(oi.quantity * p.price)
FROM orders AS o
INNER JOIN order_items AS oi
ON oi.order_id = o.id
INNER JOIN products AS p
ON p.id = oi.product_id
WHERE o.user_id=u.id
) AS total_price
FROM users u
ORDER BY total_price DESC
Any ideas how can i do that without sub-select? 任何想法,我如何做到这一点而无需子选择?
You can use Left Join
您可以使用
Left Join
SELECT u.NAME,
AS order_count,
total_price
FROM users u
LEFT JOIN (SELECT Count(*) AS order_count,
user_id
FROM orders
GROUP BY user_id) p
ON o.user_id = u.id
LEFT JOIN (SELECT Sum(oi.quantity * p.price) AS total_price,
o.user_id
FROM orders AS o
INNER JOIN order_items AS oi
ON oi.order_id = o.id
INNER JOIN products AS p
ON p.id = oi.product_id
GROUP BY o.user_id) so
ON so.user_id = u.id
ORDER BY total_price DESC
You can convert the correlated subqueries (O(N^2) performance) into LEFT JOIN 您可以将相关的子查询(O(N ^ 2)个性能)转换为LEFT JOIN
SELECT u.name,
o.order_count,
o2.total_price
FROM users u left join (
SELECT user_id, COUNT(*) order_count
FROM orders
GROUP BY user_id
) o
on u.id = o.user_id
left join (
SELECT o.user_id, SUM(oi.quantity * p.price) total_price
FROM orders o
INNER JOIN order_items oi
ON oi.order_id = o.id
INNER JOIN products p
ON p.id = oi.product_id
GROUP BY o.user_id
) o2 on u.id = o2.user_id
ORDER BY total_price DESC;
Here's the same query with one sub query (NOTE not tested for syntax but you get the idea): 这是带有一个子查询的相同查询(注意,未经语法测试,但您知道了):
select u.name, count(*) orderCount, sum(totalOrder) total order
from users u
join (select userid, o.id, sum(oi.quantity * p.price) totalorder
from orders o
join order_items as oi on oi.order_id = o.orderid
join products p on oi.product_id = p.id
group by userid, o.id) x
on u.id = x.user_id
group by u.name
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.