Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/228.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用内部联接和IN子句时防止多行返回:MySQL_Php_Mysql_Join - Fatal编程技术网

Php 使用内部联接和IN子句时防止多行返回:MySQL

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 这个查询工作正常。

我将多个表合并在一起以返回搜索结果页。在搜索页面中,用户可以切换条件,页面根据查询结果动态重新加载结果。在这方面,我面临一个特殊条件的挑战-

我有一张表叫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
这个查询工作正常。但是,如果用户决定切换某些合同类型并选择多个合同类型,则查询将返回具有相同作业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<代码>分组依据和
不同
通常具有相同的执行计划。