Mysql 基于匹配值添加列的查询
我有两张桌子:钥匙和订单 在密钥表中,我只有订单id,但我需要订单表中提供的更多详细信息,如电子邮件、姓名。。等等 如何将具有匹配订单id的键附加到另一个表中 键表Mysql 基于匹配值添加列的查询,mysql,sql,select,Mysql,Sql,Select,我有两张桌子:钥匙和订单 在密钥表中,我只有订单id,但我需要订单表中提供的更多详细信息,如电子邮件、姓名。。等等 如何将具有匹配订单id的键附加到另一个表中 键表 Key Order ID ----- -------- 1234 0001 1235 0001 1532 0002 1602 0003 1802 0004 订单表 Email Orde
Key Order ID
----- --------
1234 0001
1235 0001
1532 0002
1602 0003
1802 0004
订单表
Email Order ID
----- --------
email1@example.com 0001
email1@example.com 0001
email2@example.com 0002
email3@example.com 0003
email4@example.com 0004
所需结果:
Email Order ID Key
----- -------- -------
email1@example.com 0001 1234
email1@example.com 0001 1235
email2@example.com 0002 1532
email3@example.com 0003 1602
email4@example.com 0004 1802
一个简单的连接应该可以做到这一点:
SELECT `email`, o.`order_id`, `key`
FROM `orders` o
JOIN `keys k ON o.`order_id` = k.`order_id`
如果可以使用不带键的订单,则应使用左联接而不是联接。您需要枚举每个表中的值,以避免订单上出现笛卡尔积。在MySQL v8中,可以使用row_number。此答案显示了在早期版本中要执行的操作
select o.*, k.key
from (select o.*,
(@rno := if(@o = order_id, @rno + 1,
if(@o := order_id, 1, 1)
)
) as seqnum
from (select o.*
from orders o
order by order_id
) o cross join
(select @o := -1, @rno := 0) params
) o join
(select k.*,
(@rn, := if(@o = order_id, @rn, + 1,
if(@o := order_id, 1, 1)
)
) as seqnum
from (select k.*
from keys k
order by order_id
) k cross join
(select @o := -1, @rnk := 0) params
) k
on o.order_id = k.order_id and o.seqnum = k.seqnum;
相比之下,MySQL 8+或几乎任何其他数据库中的代码如下所示:
选择“确定”键
从选择o中,按顺序分区的行号按顺序id按顺序id按顺序id作为seqnum
从命令
o
选择k.*,按订单id划分的行号,按订单id划分的订单号作为seqnum
来自k键
K
o.order_id=k.order_id,o.seqnum=k.seqnum 您可以通过创建表值SQL函数并在查询中使用来实现这一点
CREATE FUNCTION TEST (@key varchar(20))
RETURNS @Order TABLE -- Table definition for result
(
Email varchar(100),
Name varchar(100)
)
AS
BEGIN
INSERT INTO @Order
SELECT TOP 1 EMAIL,Name FROM Order WHERE OrderId = @key
RETURN
END
然后在Select查询中检索如下结果:
SELECT *,(SELECT Email From Dbo.Test(K.OrderId)) FROM KEYS K
阅读关于加入的内容。这将为电子邮件生成四行email1@example.com.