Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 3表2连接_Mysql_Sql - Fatal编程技术网

Mysql 3表2连接

Mysql 3表2连接,mysql,sql,Mysql,Sql,目标是更新order_items表,然后更新transportcost列 在执行update语句之前,我执行select语句以检查是否获得了正确的字段: -64秒 -行数:62000 SELECT a.ordernumber, b.country, b.transportprice FROM test.inserttest3 a INNER JOIN transportcost AS b ON a.sku = b.sku WHERE a.system_created > '

目标是更新order_items表,然后更新transportcost列

在执行update语句之前,我执行select语句以检查是否获得了正确的字段: -64秒 -行数:62000

SELECT
  a.ordernumber,
  b.country,
  b.transportprice
FROM test.inserttest3 a
INNER JOIN transportcost AS b
  ON a.sku = b.sku
WHERE a.system_created > '2017-12-01'
我得到了这样一份清单:

17004706    Germany 3.00
17004706    France  6.00
17004706    Netherlands 3.00
17004706    Belgium 3.00
17004706    Austria 4.00
17004706    Italy   5.00
17004706    Switzerland 1.00
17004706    UK  8.00
17004706    Spain   4.00
17004706    Poland  4.00
17004706    Norway  9.00
17004706    Denmark 5.00
17004706    Sweden  6.00
17004706    Czech   4.00
17004706    Finland 6.00
17004706    Ireland 3.00
下一步是将此信息用于order_items表。这里出错了,这是我尝试过的,但在运行这些查询8小时后,我停止了它们

SELECT
  ps2.ordernumber,
  ps2.sku,
  ps2.country,
  ps2.transportprice
FROM test.inserttest2 aa
JOIN (SELECT
  a.ordernumber,
  b.sku,
  b.country,
  b.transportprice
FROM test.inserttest3 a
INNER JOIN transportcost AS b
  ON a.sku = b.sku
WHERE a.system_created > '2017-12-01') ps2
  ON aa.odernumber = ps2.ordernumber
WHERE aa.country = ps2.country
AND aa.system_created > '2017-12-01'
;

您希望使用transportcost表的运输价格更新称为inserttest3的order items表。要实现这一点,请首先尝试查询。这听起来很简单:只需加入表格。 您希望将此限制为2017-12-01之后创建的订单和订单项。使用适当的数据库,不可能在订单之前插入订单项目,因此我们可以将此限制为2017-12-01之后创建的订单。 查询:

select
  io.ordernumber,
  io.sku,
  io.transportcost as cost_wrong,
  t.transportprice as cost_right
from test.inserttest2 o 
join test.inserttest3 io on io.ordernumber = o.ordernumber
join transportcost t on t.sku = io.sku and t.country = o.country
where o.system_created > date '2017-12-01';
因此,日期是限制读取数据量的唯一参数。因此,此列上应该有一个索引。可能的索引:

create index idx_o on inserttest2 (system_created, ordernumber, country);
create index idx_io on inserttest3 (ordernumber, sku);
create index idx_t on transportcost (sku, country, transportprice);

您可以尝试在ON子句中移动WHERE条件以获得更好的性能。对于内部联接,使用ON应该比WHERE性能更好。请参见,谢谢!指数就是问题所在。这个查询还不正确。我有两个订单号,这很好,但我有两个相同订单号的sku。。16000020 619256 3.00 16000020 619256 3.00 16000020 619256 3.00查询应该可以。inserttest2中的同一订单号有两条记录,inserttest3中的同一订单号和sku有两条记录,或者transportprice中的同一sku和国家/地区有两条记录。所有这些都应该被主键或唯一约束禁止,但它们似乎不是。
select
  io.ordernumber,
  io.sku,
  io.transportcost as cost_wrong,
  t.transportprice as cost_right
from test.inserttest2 o 
join test.inserttest3 io on io.ordernumber = o.ordernumber
join transportcost t on t.sku = io.sku and t.country = o.country
where o.system_created > date '2017-12-01';
create index idx_o on inserttest2 (system_created, ordernumber, country);
create index idx_io on inserttest3 (ordernumber, sku);
create index idx_t on transportcost (sku, country, transportprice);