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

时间:2017-03-31 15:12:18

标签: mysql sql select subquery self-join

我试图做一个MySQL查询来选择第三方函数中的数据,但我遇到的问题是他们只传递了我的ID。我需要使用该ID来选择所有相关记录。

目前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条信息可供我使用。

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

提前致谢。

2 个答案:

答案 0 :(得分: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}'

答案 1 :(得分:1)

您可以使用元组(即,而不是查找host_idservice_id以及instance,您需要查找组合(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子句中(就像在查询中一样)。您从标题中选择 组合(host_id, service_id, instance)与具有给定ID的记录匹配。