php - 使用 INNER JOIN 和 IN 子句时防止多行返回 : MySQL

标签 php mysql join

我有多个表,我将它们连接在一起以返回搜索结果页面。在搜索页面中,用户可以切换条件,页面会根据查询结果动态重新加载结果。我在这方面遇到了一个特殊情况的挑战 -

我有一个名为 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/

相关文章:

php - WordPress 搜索查询帖子

mysql - Rails/MySQL 兼容性

mysql - 返回大量结果的组合 SQL 查询

mysql - 如何使用 SQL 合并来自多个表的数据?

php - file_get_contents() 不会超时/返回 HTTPS url 错误

php - 在框架外的 PHP 文件中调用 OpenCart 库函数

php - 为什么 mysql 在与 PDO 一起使用时只创建临时表?

mysql - 用行和列连接两个表并对它们求和

mysql - 如何为HBase创建用户登录?

mysql - 执行并集和连接