Php 使用内部联接和IN子句时防止多行返回:MySQL
我将多个表合并在一起以返回搜索结果页。在搜索页面中,用户可以切换条件,页面根据查询结果动态重新加载结果。在这方面,我面临一个特殊条件的挑战- 我有一张表叫jobs,另一张表叫job\u contract。一个作业可以有一个或多个与之关联的合同类型-将这两个类型连接在一起的简单查询是Php 使用内部联接和IN子句时防止多行返回:MySQL,php,mysql,join,Php,Mysql,Join,我将多个表合并在一起以返回搜索结果页。在搜索页面中,用户可以切换条件,页面根据查询结果动态重新加载结果。在这方面,我面临一个特殊条件的挑战- 我有一张表叫jobs,另一张表叫job\u contract。一个作业可以有一个或多个与之关联的合同类型-将这两个类型连接在一起的简单查询是 SELECT a.job_id, c.contract_type_name FROM job a INNER JOIN job_contract c ON a.job_id = c.job_id 这个查询工作正常。
SELECT a.job_id, c.contract_type_name FROM job a
INNER JOIN job_contract c ON a.job_id = c.job_id
这个查询工作正常。但是,如果用户决定切换某些合同类型并选择多个合同类型,则查询将返回具有相同作业id的多行
SELECT a.job_id, c.contract_type_name FROM job a
INNER JOIN job_contract c ON a.job_id = c.job_id AND c.contract_type IN (1,2,4)
对于上面的代码,如果一个作业确实有多个合同类型关联,那么我得到3行。我可以在不使用DISTINCT子句的情况下将其限制为1行吗?我担心使用DISTINCT会出现性能问题
非常感谢您提前提供的帮助通过a.job\u id添加
组
。这将把每个作业ID的结果组合成一行
如果您仍然希望查看单个作业的所有合同类型\u名称
s,则可以使用类似GROUP\u CONCAT()
的连接函数
编辑:为了清楚起见,您的完整查询可能是这样的:
SELECT
a.job_id,
GROUP_CONCAT(c.contract_type_name SEPARATOR ', ')
FROM
job a
INNER JOIN job_contract c
ON a.job_id = c.job_id
WHERE
c.contract_type IN (1,2,4)
GROUP BY a.job_id
如果不需要合同名称,可以使用
exists
子句:
select j.job_id
from job j
where exists (select 1
from job_contract jc
where j.job_id = jc.jobid and jc.contract_type IN (1,2,4)
);
这就消除了分组by
/distinct
。它在作业\合同(作业id、合同类型)
上有索引时性能最佳
然后,您可以使用以下方式获得合同:
select j.job_id,
(select group_concat(contract_type_name)
from job_contract jc
where j.job_id = jc.jobid and jc.contract_type IN (1,2,4)
) as contracts
from job j
where exists (select 1
from job_contract jc
where j.job_id = jc.jobid and jc.contract_type IN (1,2,4)
);
我建议您使用
分组依据
/不同的
,因为查询很清楚,除非您有充分的理由不这样做。“我可以将此限制为1行吗”-您是否尝试过限制1
?这会将整个结果集限制为仅1行。这不能解决问题。例如,如果我在作业表中有两个作业ID,并且每个ID都与2或3个合同类型关联,那么使用LIMIT 1将只返回1行。相反-我希望每个工作都有一行,不管他们与多少合同类型相关。DistinctHanks jessepinho没有(或至少可以忽略不计)性能问题-这确实有帮助。只有一个问题-使用GROUP BY是否会对性能产生影响?我知道DISTINCT不被认为是一种好的做法,因为MYSQL检索所有行,然后丢弃重复的行-GROUP BY在性能影响方面是否相似?@ChicagoSky<代码>分组依据和不同
通常具有相同的执行计划。