查询基于匹配值添加列

时间:2018-06-09 09:35:52

标签: mysql sql select phpmyadmin

我有两张桌子:钥匙和订单

密钥表中,我只有订单ID ,但我需要订单表中提供的更多详细信息,例如< em>电子邮件,姓名等等。

如何将具有匹配订单ID 的密钥附加到另一个表?

按键表

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

3 个答案:

答案 0 :(得分:1)

一个简单的join应该可以解决问题:

SELECT `email`, o.`order_id`, `key`
FROM   `orders` o
JOIN   `keys k ON o.`order_id` = k.`order_id`

如果订单没有密钥,您应该使用left join代替join

答案 1 :(得分:0)

您需要枚举每个表中的值,以避免订单上的笛卡尔积。在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。,k .key from(select o。,row_number()over(order by order_id order by order_id)as seqnum       来自订单o      )o      (选择k。*,row_number()over(按order_id分区,order by order_id)作为seqnum       来自钥匙k      )k      on o.order_id = k.order_id and o.seqnum = k.seqnum;

答案 2 :(得分:0)

您可以通过创建一个值为SQL Function的表并在查询中使用来实现此目的。

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