简体   繁体   English

使用SQL从数据库中选择数据

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM