Mysql 如果主表有两个主键,如何使用两个表增强子查询以使用3个表进行搜索?

Mysql 如果主表有两个主键,如何使用两个表增强子查询以使用3个表进行搜索?,mysql,sql,sql-server,subquery,Mysql,Sql,Sql Server,Subquery,主表为“M_Order”,其中包含订单及其详细信息 M_order row_id |Order_Num | Order_Status | created | created_by | Account_ID -------------------------------------------------------------- 1-a | 1 | complete | 2016-08-25 | jhon | 3-a 1-b | 2

主表为“M_Order”,其中包含订单及其详细信息

M_order
row_id |Order_Num | Order_Status | created     | created_by | Account_ID
--------------------------------------------------------------
1-a    | 1        | complete     | 2016-08-25  |    jhon    | 3-a
1-b    | 2        | pending      | 2016-08-26  |    mike    | 3-b
1-c    | 3        | failed       | 2015-08-27  |    mike    | 3-c
1-d    | 4        | pending      | 2015-08-25  |    jhon    | 3-d
1-e    | 5        | failed       | 2016-08-26  |    mike    | 3-e
1-f    | 6        | New          | 2017-03-27  |    jhon    | 3-f
第二个表是“订单时间”,其中包含每个订单的产品列表

Order_itmes
row_id |Order_id | Product_ID
--------------------------------------------------------------
2-a    | 1-a     |  Prod_1    
2-b    | 1-b     |  Prod_2   
2-c    | 1-c     |  Prod_1 
2-d    | 1-d     |  Prod_1    
2-e    | 1-e     |  Prod_1   
2-f    | 1-f     |  Prod_3  
“M_order”表中的行id是唯一的,在“order_items”表中作为订单id可用

我有一个查询,显示来自“订单项目”的具有特定产品id的订单

Select Order_Num,Order_status,created ,created_by
  from M_order where row_id in (select Order_id from Order_itmes where 
Product_ID='Prod_1')
  where Order_Status='Failed'
     Order By created desc
如果我有第三个表“Accounts”,其列行id与“M\u Order”中account id中的同一列相同

 Accounts
 row_id  | Name 
--------------------------------------------------------------
 3-a     | cutomer1
 3-b     | cutomer2
 3-c     | cutomer3
 3-d     | cutomer4
 3-e     | cutomer5
 3-f     | cutomer6
如何增强上述查询以在结果中列出客户名称并显示如下

Order_Num | Order_status | created   | created_by  |  name
-------------------------------------------------------------   
5         | failed       |2016-08-26 | mike        | customer5
3         | failed       |2015-08-27 | mike        | customer3

您可以向
帐户添加
加入

select o.Order_Num, o.Order_status, o.created, o.created_by, a.name
from M_order o
  inner join Accounts a
    on o.Account_ID = a.row_id
where o.row_id in (
    select Order_id 
    from Order_items 
    where Product_ID='Prod_1'
    )
  and o.Order_Status='Failed'
order by o.created desc

我认为在这种情况下最好使用
JOIN
,因为一旦我们有两个以上的表,子查询就会变得复杂。一个简单的
JOIN
可以在这里工作,例如:

SELECT o.order_num, o.order_status, o.created, o.created_by, a.name
FROM m_order o JOIN order_items oi ON o.row_id = oi.order_id
JOIN accounts a ON o.account_id = a.row_id
WHERE oi.product_id = 'Prod_1';

桌子怎么能有2个主键

我不是在评论索引,因为您发布了真实的表结构和真实的数据类型

IDs作为1-a、2-a或3-a的用途是什么

表应将id自动递增为CI

此外,Order表还包含数百万条记录,所以不使用分页就不能简单地查询任何内容

试试这个

declare @M_order table(row_id varchar(30),Order_Num int,Order_Status varchar(30)
,created date,created_by varchar(30),Account_ID varchar(30))
insert into @M_order VALUES
('1-a',1,'complete','2016-08-25','jhon','3-a')
,('1-b',2,'pending','2016-08-26','mike','3-b')
,('1-c',3,'failed','2015-08-27','mike','3-c')
,('1-d',4,'pending','2015-08-25','jhon','3-d')
,('1-e',5,'failed','2016-08-26','mike','3-e')
,('1-f',6,'New ','2017-03-27','jhon','3-f')

declare @Order_itmes table(row_id varchar(30),Order_id varchar(30), Product_ID varchar(30))
insert into @Order_itmes VALUES
('2-a','1-a','Prod_1'),('2-b','1-b','Prod_2'),('2-c','1-c','Prod_1') 
,('2-d','1-d','Prod_1'),('2-e','1-e','Prod_1'),('2-f','1-f','Prod_3') 

declare @Accounts table(row_id varchar(30),Name varchar(30)) 
insert into @Accounts values
 ('3-a','cutomer1') ,('3-b','cutomer2') ,('3-c','cutomer3')
 ,('3-d','cutomer4') ,('3-e','cutomer5') ,('3-f','cutomer6')


 select mo.Order_Num ,mo.Order_status , mo.created , mo.created_by ,name
 from @M_order MO
 inner join @Accounts A
 on mo.Account_ID=a.row_id
 where Order_status='failed'
 and
 exists(
 select Order_id from @Order_itmes OI where 
Product_ID='Prod_1' and oi.Order_id=mo.row_id
 )

sql server或mysql?谢谢,这一个很有魅力,甚至我也做了一些调整,包括了4个以上的表。不是2个主键,而是一个用于order表,另一个是唯一的,主要用于account表至于索引,它不是真实的,我们有一个最接近的解释