Mysql选择查询3个表

Mysql选择查询3个表,mysql,sql,Mysql,Sql,我有3个表订单、订单选项、产品选项 订单 order_id | cus_name | cus_phone ------------------------------- 1 | Test-1 | 9876543211 2 | Test-2 | 9876543212 3 | Test-3 | 9876543213 4 | Test-4 | 9876543214 订购选项 product_option_id | order_i

我有3个表订单、订单选项、产品选项

订单

order_id | cus_name | cus_phone
-------------------------------
1        | Test-1   | 9876543211
2        | Test-2   | 9876543212
3        | Test-3   | 9876543213
4        | Test-4   | 9876543214
订购选项

product_option_id | order_id 
-------------------------------
11                | 1
12                | 1
13                | 2
14                | 4
15                | 3
product_id | product_option_id | sku     | qty
------------------------------------------
1          | 11                | TS01    | 3
2          | 12                | TS02    | 2
3          | 13                | TS033   | 3
4          | 14                | TS023   | 3
产品选项

product_option_id | order_id 
-------------------------------
11                | 1
12                | 1
13                | 2
14                | 4
15                | 3
product_id | product_option_id | sku     | qty
------------------------------------------
1          | 11                | TS01    | 3
2          | 12                | TS02    | 2
3          | 13                | TS033   | 3
4          | 14                | TS023   | 3
在这里,我想在
sku
字段中选择带有where条件的
order
表格和
product\u选项
表格值

我尝试按如下方式加入查询:

SELECT o.order_id, o.cus_name, o.cus_phone,po.sku,po.qty FROM order o 
LEFT JOIN order_option op 
ON (o.order_id = op.order_id) 
LEFT JOIN product_option po
ON (op.product_option_id = po.product_option_id) 
WHERE po.sku = "TS023"

但它没有给出正确的答案。我不知道我错过了什么。

@Matt是正确的,这里有另一种方法

SELECT o.order_id, o.cus_name, o.cus_phone, po.sku, po.qty 
FROM `order` o, order_option op, product_option po
WHERE o.order_id = op.order_id
AND op.product_option_id = po.product_option_id
AND po.sku = "TSO23"

@马特是对的,这是另一种方法

SELECT o.order_id, o.cus_name, o.cus_phone, po.sku, po.qty 
FROM `order` o, order_option op, product_option po
WHERE o.order_id = op.order_id
AND op.product_option_id = po.product_option_id
AND po.sku = "TSO23"

order
是保留字,请使用backticks```

SELECT o.order_id, o.cus_name, o.cus_phone, po.sku, po.qty 
FROM `order` o 
LEFT JOIN order_option op ON o.order_id = op.order_id
LEFT JOIN product_option po ON op.product_option_id = po.product_option_id
WHERE po.sku = "TS023"
输出:

order_id    cus_name    cus_phone   sku     qty
4           Test-4      9876543214  TS023   3

SQL Fiddle:

顺序
是保留字,请使用反勾“`”

SELECT o.order_id, o.cus_name, o.cus_phone, po.sku, po.qty 
FROM `order` o 
LEFT JOIN order_option op ON o.order_id = op.order_id
LEFT JOIN product_option po ON op.product_option_id = po.product_option_id
WHERE po.sku = "TS023"
输出:

order_id    cus_name    cus_phone   sku     qty
4           Test-4      9876543214  TS023   3

SQL FIDLE:

将采购订单条件从
的WHERE
移动到
ON
以获得true
左连接
结果:

SELECT o.order_id, o.cus_name, o.cus_phone,po.sku,po.qty FROM order o 
LEFT JOIN order_option op 
ON (o.order_id = op.order_id) 
LEFT JOIN product_option po
ON (op.product_option_id = po.product_option_id) 
AND po.sku = "TS023"

(在WHERE中时,您将获得常规的内部联接结果。)

将po条件从
WHERE
移动到
ON
以获得真正的
左联接
结果:

SELECT o.order_id, o.cus_name, o.cus_phone,po.sku,po.qty FROM order o 
LEFT JOIN order_option op 
ON (o.order_id = op.order_id) 
LEFT JOIN product_option po
ON (op.product_option_id = po.product_option_id) 
AND po.sku = "TS023"


(在WHERE中时,您将获得常规的内部联接结果。)

它现在显示了什么,您希望看到什么?您希望从当前查询中看到多少条记录?@TimBiegeleisen:超过100条rows@JoakimDanielson我试图通过SKU从您的样本数据中获取订单列表。您的示例数据中应该返回多少行?它现在显示了什么?您期望得到什么?您期望从当前查询中得到多少记录?@TimBiegeleisen:超过100条rows@JoakimDanielson我试图通过SKU从您的样本数据中获取订单列表。示例数据中应该返回多少行?不要这样连接表,应该使用符合ANSI标准的连接。@Matt这只是另一种方法。我同意应该使用ANSI连接,但这并不会降低它的正确性。参考:Oracle明确建议使用符合ANSI标准的联接。当前提示:切换到现代的显式
JOIN
语法。更容易编写(没有错误),更容易阅读(和维护),并且在需要时更容易转换为外部联接。@jarlh我知道,如果您阅读我的注释^^^,但对于简单的查询,我倾向于使用旧版本。不要这样联接表,您应该使用符合ANSI的联接。@Matt这只是另一种方式。我同意应该使用ANSI连接,但这并不会降低它的正确性。参考:Oracle明确建议使用符合ANSI标准的联接。当前提示:切换到现代的显式
JOIN
语法。更容易写(没有错误),更容易读(和维护),更容易转换为外部连接(如果需要)。@jarlh我知道,如果您阅读了我的评论^^,但对于简单的查询,我倾向于使用旧版本。@ramesh怀疑?选择购买
sku=TS023
的订单列表查询是什么?@ramesh怀疑?选择购买
sku=TS023
的订单列表查询是什么?