Mysql 如何基于多列键进行子选择

Mysql 如何基于多列键进行子选择,mysql,sql,Mysql,Sql,我正在使用一个遗留数据库,该数据库对产品使用三列键。我想选择状态为“a”或在第二个表中有匹配记录的所有产品。如果是像“id”这样的单列主键,我会这样做: SELECT * FROM `product` WHERE `status` = 'A' OR `id` IN (SELECT `foreign_key` FROM `table2`) 但是,我不知道如何使用三个键执行IN子句subselect。我想我可以将键连接在一起并比较字符串,但这似乎效率极低。有没有一种方法可以在没有连

我正在使用一个遗留数据库,该数据库对产品使用三列键。我想选择状态为“a”或在第二个表中有匹配记录的所有产品。如果是像“id”这样的单列主键,我会这样做:

SELECT * FROM `product` 
WHERE `status` = 'A'
       OR `id` IN (SELECT `foreign_key` FROM `table2`)
但是,我不知道如何使用三个键执行IN子句subselect。我想我可以将键连接在一起并比较字符串,但这似乎效率极低。有没有一种方法可以在没有连接的情况下实现这一点?

您可以使用联合:

SELECT * 
FROM   'product' 
WHERE  'status' = 'A'
UNION
SELECT * 
FROM   'product' 
       JOIN 'table2' 
       ON (product.id = table2.foreign_key 
       AND ...)
你可以使用工会:

SELECT * 
FROM   'product' 
WHERE  'status' = 'A'
UNION
SELECT * 
FROM   'product' 
       JOIN 'table2' 
       ON (product.id = table2.foreign_key 
       AND ...)

您可以将表product和table2保留在复合键上,然后status='A'或table2.id不为NULL


左[OUTER]联接可以比等效子查询更快,因为服务器可能能够更好地优化它

您可以将联接表product和table2留在复合键上,然后status='A'或table2.id不为NULL

左[外部]联接可能比等效子查询快,因为服务器可能能够更好地优化它

执行左联接:

SELECT p.* FROM product p
LEFT JOIN table2 t2 on p.key1 = t2.key1 and p.key2 = t2.key2 and p.key3 = t2.key3
WHERE status = 'A' OR t2.key1 IS NOT NULL
进行左连接:

SELECT p.* FROM product p
LEFT JOIN table2 t2 on p.key1 = t2.key1 and p.key2 = t2.key2 and p.key3 = t2.key3
WHERE status = 'A' OR t2.key1 IS NOT NULL
您可以在此处使用EXISTS关联子查询您可以在此处使用EXISTS关联子查询