【发布时间】:2018-07-04 20:47:08
【问题描述】:
目标是获取最接近的 m3 数量和重量的价格并将其放在表格中。
此示例适用于我。但我硬编码m3,weight,country 和transportername
查询1:
SELECT
country,
transportername,
ABS(m3-0.5) as ABS_M3 ,
m3,
ABS(weight-5) as ABS_weight,
weight,
price
FROM database.transportcost
WHERE m3 >= 0.5 AND
weight >= 5 AND
country = "GB" AND
transportername like '%aa%'
Group by transportername
Order by ABS(m3-0.5) +
ABS(weight-5) +
price
现在我想从另一个表中获取硬编码值。我不知道我需要在~~xx.volumen~~ 和~~xx.gewicht~~ 中输入什么值。
查询2:
INSERT INTO database.transportcostPerItem (sku,country,transportname,weight,m3,price)
SELECT g.orderitemid, p2.country, p2.transportername, p2.weight, p2.m3, p2.price
FROM database.orderitem g
JOIN database.order i on i.orderid = g.orderid
JOIN database.matrixtable xx on g.orderitemid = xx.sku
JOIN database.vlog cc on i.orderid = cc.orderid
JOIN
(
SELECT *
FROM database.transportcost
Group by transportername
Order by ABS(m3-~~xx.volumen~~) +
ABS(weight-~~xx.gewicht~~) +
price
) as p2 on p2.country = i._country AND
p2.transportername = cc._transportername AND
p2.weight = xx.gewicht AND
p2.m3 = xx.volumen
;
编辑:
样本数据
表:database.transportcost 国家 |运输名称 |立方米 |重量 |价钱 --------+-----------------+--------+--------+------ --- 国标 |啊 | 50.00 | 50 | 77.70 国标 | bb | 0.50 | 125 | 83.19 国标 |抄送| 0.50 | 125 | 96.03 国标 | bb | 0.60 | 150 | 83.19 国标 |啊 | 75.00 | 75 | 89.04 国标 |抄送| 0.60 | 150 | 96.03 国标 | dd | 50.00 | 50 | 163.38 国标 |抄送| 0.70 | 175 | 96.03 国标 | bb | 0.70 | 175 | 96.85 国标 |呃 | 0.53 | 175 | 102.78 国标 | gg | 0.53 | 175 | 110.37 国标 |啊 | 100.00 | 100 | 89.04 国标 |抄送| 0.80 | 200 | 96.03 国标 | bb | 0.80 | 200 | 96.85 国标 | ff | 0.60 | 200 | 110.33 德 |啊! 0.50 | 50 | 26.40 德 | bbb | 0.50 | 75 | 31.84 德 |啊! 0.75 | 75 | 34.19 德 |抄送 | 0.50 | 100 | 34.17 德 | bbb | 0.67 | 100 | 35.47 德 |抄送 | 1.00 | 100 | 37.59 德 | dd | 0.50 | 100 | 62.38 德 |抄送 | 0.63 | 125 | 43.04 德 | bbb | 0.83 | 125 | 44.24 德 |啊! 0.93 | 125 | 45.84 德 | eee | 0.50 | 125 | 53.80 德 | ff | 0.50 | 125 | 54.02Query 1 国家/地区的结果GB
Query 1 国家/地区的结果DE
Query 2 最终的结果应该是这样的:
【问题讨论】:
-
样本数据和期望的结果真的很有帮助。一个明确的问题也会有所帮助。
-
@GordonLinoff 添加样本
-
您的查询无效。您按 trasportername 分组,但不要告诉 DBMS 您想要获得什么聚合值。 MySQL 允许这种情况发生并任意选择值。例如,它可以为运输机 aa 选择 m3 = 100.00,重量 = 75,价格 = 77.70,这个结果将是有效的,因为您没有说您想要最大 m3 还是最小 m3 或任何一个。显然,DBMS 选择了 50.00 / 50 / 77.70 作为 transportername aa,但这是您不能依赖的随机结果。
-
@ThorstenKettner 你是对的,我应该在那里设置一个限制。顺便说一句,你是如何设计这样的结果表的?
-
您的查询无法通过“限制”来修复。如果您按
transportername分组,那么您的选择列表必须只包含transportername和聚合,例如min(m3)、max(price)、avg(weight)等。您可能想SET sql_mode = 'ONLY_FULL_GROUP_BY'以免让 MySQL 让此类查询被忽视。设置此模式后,您会收到一条错误消息,告诉您正在选择未由组或聚合函数指定的值。