我如何正确地加入这3张桌子?

时间:2019-04-15 03:25:25

标签: mysql vb.net

我有3张桌子。订单,copack,copack_products。我正在尝试仅从订单中收集6列,但需要确保这些订单中的产品属于这些copack。这些表的我的架构如下:

Table: orders
Columns:
idorders int(11) AI PK 
orderid varchar(45) 
orderstatus varchar(45) 
orderdate date 
subtotal int(11) 
shippingcost int(11) 
couponcode varchar(45) 
couponname varchar(45) 
coupontotal int(11) 
ordertotal int(11) 
refundamount int(11) 
customerid varchar(45) 
customername varchar(100) 
customeremail varchar(100) 
customerphone varchar(45) 
shipmethod varchar(45) 
paymentmethod varchar(45) 
storecreditredeemed int(11) 
totalquantity int(11) 
dateshipped date 
ordernotes varchar(400) 
customermessage varchar(400) 
shippingname varchar(45) 
shippingfirstname varchar(45) 
shippinglastname varchar(45) 
shippingcompany varchar(100) 
shippingstreet1 varchar(200) 
shippingstreet2 varchar(100) 
shippingsuburb varchar(45) 
shippingstate varchar(45) 
shippingzip varchar(45) 
shippingcountry varchar(45) 
shippingemail varchar(100) 
customergroupname varchar(45) 
productid int(11) 
productqty int(11) 
productsku varchar(200) 
productname varchar(200) 
productvariation varchar(200) 
productunitprice int(11) 
producttotalprice int(11) 
uniqueproductsinorder int(11) 
ordersource varchar(45) 
importid varchar(100) 
customerrep varchar(100)

Table: copacks
Columns:
idcopacks int(11) AI PK 
copackname varchar(100)

Table: copack_products
Columns:
idcopack_products int(11) AI PK 
copacknameid varchar(45) 
copackname varchar(100) 
productname varchar(100) 
productvariation varchar(100) 
mfgprice decimal(10,0)

查询时间超过30秒,并且超时。

我尝试了以下代码:

 Using cmd As New MySqlCommand("
SELECT orders.orderdate, orders.customername, orders.productqty, orders.productname, orders.productvariation, orders.producttotalprice
    , copacks.copackname, copack_products.productname, copack_products.productvariation  
FROM orders, copacks, copack_products 
INNER JOIN orders productname ON (productname.productname = copack_products.productname)  
INNER JOIN orders productvariation ON (productvariation.productvariation = copack_products.productvariation)  
WHERE copacks.copackname = '" & lblcopackname.Text & "' 
    AND orders.orderdate BETWEEN '" & date1.Value.ToString("yyyy-MM-dd") & "' AND '" & date2.Value.ToString("yyyy-MM-dd") & "' 
GROUP BY orders.productname
", con)

2 个答案:

答案 0 :(得分:0)

第一个问题是这部分:

FROM orders, copacks, copack_products 

这会在您开始添加其他INNER JOIN步骤之前在 之前连接三个表,并且在没有任何连接条件的情况下执行此操作,从而最终导致所有这些组合的每种可能组合表。

此外,还不能使用字符串串联将用户提供的值放入SQL查询中!。您需要了解有关参数化查询的信息。我想展示一个使用该问题中的SQL的示例,但不幸的是,该问题做得太差,无法发布一个很好的示例:(

最后,此架构设计需要大量帮助。传统上,orders不会直接包含产品。相反,将有一个order_header表和一个order_detailorder_lines表。 order_detail表将具有一个order_id表中order_header的外键,这样您就可以为同一order_detail拥有多个order_header记录。它也是order_detail表,并且仅{em> order_detail表,将引用各个产品。

copack_products表存在类似的问题。在该表中按名称引用参考产品和联合包装是不好的。表格的更好设计如下所示:

Table: copack_products
Columns:
idcopack_products int(11) AI PK 
copackid int(11)
productid int(11) 

只需在该表中放入连接到权威的copack和product表所需的最小值,并且如果此时允许与主表有所不同,则仅使用其他列。

答案 1 :(得分:0)

您的查询效率不高。您没有正确加入表格。您应该使用以下查询

SELECT orders.orderdate,
       orders.customername,
       orders.productqty,
       orders.productname,
       orders.productvariation,
       orders.producttotalprice,
       copacks.copackname,
       copack_products.productname,
       copack_products.productvariation
FROM orders productname
INNER JOIN copack_products ON (productname.productname = copack_products.productname)
AND (productname.productvariation = copack_products.productvariation)
INNER JOIN copacks ON copacks products.copacknameid = copacks.Idcopacks
WHERE copacks.copackname = '" & lblcopackname.Text & "'
  AND orders.orderdate BETWEEN '" & date1.Value.ToString("yyyy-MM-dd") & "' AND '" & date2.Value.ToString("yyyy-MM-dd") & "'
GROUP BY orders.productname ", con)