我有多个表,我将它们连接在一起以返回搜索结果页面。在搜索页面中,用户可以切换条件,页面会根据查询结果动态重新加载结果。我在这方面遇到了一个特殊情况的挑战 -
我有一个名为 jobs 的表和另一个名为 job_contract 的表。一项工作可以有一个或多个与之关联的契约(Contract)类型 - 将这两个类型连接在一起的简单查询是
SELECT a.job_id, c.contract_type_name FROM job a
INNER JOIN job_contract c ON a.job_id = c.job_id
这个查询工作正常。但是,如果用户决定切换某些契约(Contract)类型并选择多个契约(Contract)类型,则查询将返回具有相同作业 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)
对于上面的代码,如果一个工作确实有多个契约(Contract)类型关联,那么我会得到 3 行。我可以在不使用 DISTINCT 子句的情况下将其限制为 1 行吗 - 我担心使用 DISTINCT 会出现性能问题
非常感谢您提前提供的帮助
最佳答案
如果您不需要合约名称,可以使用 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)
);
这消除了group by
/distinct
。在 job_contract(job_id,contract_type)
上建立索引时,它的性能最佳。
然后您可以使用以下方式获取契约(Contract):
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)
);
由于查询清晰,我建议您使用group by
/distinct
,除非您有充分的理由不这样做。
关于php - 使用 INNER JOIN 和 IN 子句时防止多行返回 : MySQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24975743/