Mysql选择查询3个表
我有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
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
的订单列表查询是什么?