MySQL 在多个字段上进行子选择

MySQL where subselect on multiple fields

我正在尝试对第三方函数内的 select 数据进行单个 MySQL 查询,这是我遇到的问题,但他们只向我传递了 ID。我需要使用该 ID 来 select 所有相关记录。

目前 MySQL 语句看起来像这样:

SELECT h.id, h.notification_id, h.status, d.detail 
FROM headers h, details d 
WHERE h.host_id = (SELECT host_id FROM headers WHERE id = '{$rowid}') 
AND h.service_id = (SELECT service_id FROM headers WHERE id = '{$rowid}') 
AND h.instance = (SELECT instance from headers where id = '{$rowid}')
AND h.id = d.header_id;

现在这行得通了,但我认为可怜的 MySQL 引擎正在 运行 宁 3 个子查询,因为我没有 3 条可用的信息。

所以我想知道是否有办法 运行 使用一个查询和一个子查询来节省数据库的负载?

提前致谢。

您可以使用SELF JOIN 来删除多个子查询。

试试这个:

SELECT h.id, h.notification_id, h.status, d.detail 
FROM headers h 
INNER JOIN details d ON h.id = d.header_id 
INNER JOIN headers h2 ON h.host_id = h2.host_id AND h.service_id = h2.service_id AND h.instance = h2.instance 
WHERE h2.id = '{$rowid}'

您可以使用元组(即,与其查找 host_idservice_idinstance,不如查找组合 (host_id, service_id, instance)):

SELECT h.id, h.notification_id, h.status, d.detail 
FROM headers h
JOIN details d ON d.header_id = h.id
WHERE (h.host_id, h.service_id, h.instance) = 
  (SELECT host_id, service_id, instance FROM headers WHERE id = '{$rowid}') 
;

这会将条件放在它所属的位置:在 where 子句中(就像在您的查询中一样)。您 select from headers 和详细信息 where 组合 (host_id, service_id, instance) 匹配具有给定 ID 的记录。