优化 Sql Query 去掉 SELECT 子句并使用 JOIN

Posted

技术标签:

【中文标题】优化 Sql Query 去掉 SELECT 子句并使用 JOIN【英文标题】:Optimize Sql Query remove SELECT clause and use JOIN 【发布时间】:2016-01-05 11:49:50 【问题描述】:

不是 SQL 专家

我正在尝试提出一个 SQL 查询来对 4 个表进行 JOIN。我正在使用 mysql,我有一个有效的查询,但它需要优化。

这是我展示的四个表:

客户

+--------------+---------+------+-----+---------+----------------+-------+
| id        | first_name    | last_name | email | zip | phone | type_id  |
+--------------+---------+------+-----+---------+----------------+-------+

订购

+--------------+---------+---
| id        | product_name   |
+--------------+---------+---

客户订单

+--------------+---------+
| customer_id  | order_id|
+--------------+---------+

客户类型

+--------------+----
| type_id   | type | 
+--------------+----

解决方案 1:

这是我可以想出并有效的 mysql 查询。但它之间有一个Select 子句,我不喜欢它。我想用JOIN 替换它并尝试了很多东西,但我遇到了语法错误。

SELECT DISTINCT c.id AS cus_id,
                c.email,
                c.phone,
                c.zip,
                c.last_name,
                c.first_name,
                coo.product_name,
                ct.type AS cus_type
FROM customer c
LEFT OUTER JOIN
  (SELECT o.product_name,
          co.customer_id
   FROM customer_order co,
   order o
   WHERE co.customer_id = o.id) coo ON coo.customer_id = c.id
JOIN customer_type ct ON ct.type_id = c.type_id

解决方案 2:

我重构了上面的查询,用JOIN 部分替换了WHERE 条件,但这仍然与上面的查询相同,可以按我的意愿工作。

SELECT DISTINCT c.id AS cus_id,
                c.email,
                c.phone,
                c.zip,
                c.last_name,
                c.first_name,
                coo.product_name,
                ct.type AS cus_type
FROM customer c
LEFT OUTER JOIN
  (SELECT o.product_name,
          co.customer_id
   FROM customer_order co
   JOIN
   order o ON co.customer_id = o.id) coo ON coo.customer_id = c.id
JOIN customer_type ct ON ct.type_id = c.type_id

有人可以指导我如何用JOIN 替换我在两者之间使用的SELECT 查询。

感谢您的帮助。

【问题讨论】:

【参考方案1】:

试试这个…………

SELECT c.id AS cus_id, c.email, c.phone, c.zip, 
c.last_name, c.first_name, o.product_name, ct.type AS cus_type
FROM customer c
INNER JOIN customer_type ct ON ct.type_id = c.type_id
LEFT  JOIN customer_order co ON co.customer_id = c.id
LEFT  JOIN order o ON co.order_id = o.id

【讨论】:

感谢您的查询,但它不像我所拥有的那样工作。它返回的行数更少。有什么可以更新的吗? 只是给你一个反馈,订单表中可能有NULL product_name 值,这是缺少的行。

以上是关于优化 Sql Query 去掉 SELECT 子句并使用 JOIN的主要内容,如果未能解决你的问题,请参考以下文章

@Query的SELECT子句中的参数?

SQL Query 总是按子句顺序使用文件排序

sql优化

SQL联合子句优化

如何在views.py上优化Django SQL SELECT Query?

通过添加嵌入在 PL-SQL(Oracle 函数)中的 select 子句来处理异常