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_id
和 service_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 子句中(就像在您的查询中一样)。您 select from headers 和详细信息 where 组合 (host_id, service_id, instance)
匹配具有给定 ID 的记录。
我正在尝试对第三方函数内的 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_id
和 service_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 子句中(就像在您的查询中一样)。您 select from headers 和详细信息 where 组合 (host_id, service_id, instance)
匹配具有给定 ID 的记录。