关于连接三个表的提示

时间:2015-04-28 06:29:21

标签: mysql sql join

我试图加入几张牌桌,因为我需要在所有牌桌中加入价值。

到目前为止,我尝试了两种方法:

第一种方式:

SELECT
    o.`order_id` as `Order ID`,
    o.`STATUS` as `Order Status`,
    o.`date_created` as `Date Created`,
    op.`SKU`,
    op.`NAME`,
    o.`STATE`,
    op.`QUANTITY`,
    c.`customer_id`
FROM
    `orderProducts` op
INNER JOIN
    orders o on op.order_id = o.order_id
INNER JOIN
    customers c on c.customer_id = o.customer_id
WHERE
    o.order_id IN (616898, 616901)

第二种方式:

SELECT
    o.`order_id` as `Order ID`,
    o.`STATUS` as `Order Status`,
    o.`date_created` as `Date Created`,
    op.`SKU`,
    op.`NAME`,
    o.`STATE`,
    op.`QUANTITY`,
    c.`customer_id`
FROM
    `orders` o,
    `orderproducts` op,
    `customers` c
WHERE
    o.order_id IN (616898, 616901)
AND
    c.customer_id= o.customer_id
AND
    o.order_id = op.order_id

表数据:

订单

+----------------------------+------------+------+-----+
| Field                      | Type       | Null | Key |
+----------------------------+------------+------+-----+
| order_id                   | int(11)    | NO   | PRI |
| customer_id                | int(11)    | YES  |     |

orderproducts

+----------------------------+------------+------+-----+
| Field                      | Type       | Null | Key |
+----------------------------+------------+------+-----+
| order_id                   | int(11)    | NO   |     |

客户

+----------------------------+------------+------+-----+
| Field                      | Type       | Null | Key |
+----------------------------+------------+------+-----+
| customer_id                | int(11)    | NO   | PRI |

抱歉,但我真的不知道如何表达我想要的数据,我会尽力解释。

我希望我的select语句中的列来自订单616898和616901。 order_id字段在order和orderproducts表中都是相同的。 customer_id字段在订单和客户表中都相同。这就像我使用order_id从orderproducts表中添加额外的列SKU,NAME,QUANTITY,使用订单和customers表中的customer_id提取正确的列和列电子邮件。

1 个答案:

答案 0 :(得分:1)

您需要将orderscustomer加入customer_id,并且最好使用ID加入。

所以查询将是

SELECT
    o.`order_id` as `Order ID`,
    o.`STATUS` as `Order Status`,
    o.`date_created` as `Date Created`,
    op.`SKU`,
    op.`NAME`,
    o.`STATE`,
    op.`QUANTITY`,
    c.`email`
FROM
    `orders` o
INNER JOIN
    orderProducts op on op.order_id = o.order_id
INNER JOIN
    customers c on c.customer_id = o.customer_id
WHERE
    o.order_id IN (616898, 616901)

现在这将做什么

  • 如果有匹配的数据,即order_id位于orders且位于orderproducts且同一customer_id,则会尝试加入所有表格在orderscustomers

  • 最后仅将数据过滤到616898 or 616901

请注意,如果给定过滤器没有可用的匹配数据,则可能无法获得结果。如果您仍然希望从orders表返回数据,即使没有匹配并将表数据连接为null,您可能需要将inner join更改为left join