优化 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的主要内容,如果未能解决你的问题,请参考以下文章