Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.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 具有1对多表的Mysql select语句_Php_Mysql - Fatal编程技术网

Php 具有1对多表的Mysql select语句

Php 具有1对多表的Mysql select语句,php,mysql,Php,Mysql,我试图从php中传递给我的类的未知变量数组中构建一个mysql语句。问题不在于构建我可以做到的语句本身,而在于创建一个更好、更有效的语句 我简化了下表,只显示了核心属性 我有一张主桌 工作 然后链接到保存所有作业属性的第二个表 Job_属性 示例数据: 工作 Job_属性 所以job 1 jid=1具有这4个属性,jpid只是一个唯一的自动增量id 现在,当搜索进来时,我希望根据job_属性进行搜索。搜索当然可以包括一些和/或任何属性。我只想从查询中收到明显唯一的jid,所以不是4个相同的jid

我试图从php中传递给我的类的未知变量数组中构建一个mysql语句。问题不在于构建我可以做到的语句本身,而在于创建一个更好、更有效的语句

我简化了下表,只显示了核心属性

我有一张主桌

工作 然后链接到保存所有作业属性的第二个表

Job_属性 示例数据:

工作 Job_属性 所以job 1 jid=1具有这4个属性,jpid只是一个唯一的自动增量id

现在,当搜索进来时,我希望根据job_属性进行搜索。搜索当然可以包括一些和/或任何属性。我只想从查询中收到明显唯一的jid,所以不是4个相同的jid

我目前对这个问题的编码方式是使用多个IN子句,这将产生如下结果:

从作业j中选择j.jid,其中 jid在从job_properties中选择jid,其中j_arg='salary'和j_value>'40000',jid在从job_properties中选择jid,其中j_arg='address_2'和j_value='some lovely town'。。。为传递给搜索的每个值插入更多IN子句

我循环遍历传递的数组中的每个变量,并向where语句添加另一个in子句

然而,我觉得这是相当低效的,当我开始收到大量的搜索时,它将真的减慢一份工作可以有20-30个属性

有没有更好的方法,比如使用have和group by

这类似于这个问题:,但我还需要查询另一个表中的参数,而不仅仅是属性

提前谢谢

尼克


另外,我不能缓存结果,也不担心创建的开销,因为很明显,结果取决于搜索时数据库中的作业,并且每小时都会发生变化。

这会导致您的目标吗

SELECT 
  j.jid 
FROM 
  job j
  JOIN jop_properties jp ON j.jid = jp.jid
WHERE 
     ( j_arg = 'salary'    AND j_value > '40000'            )
  OR ( j_arg = 'address_2' AND j_value = 'some lovely town' )
  OR [insert more combinations here]

我想这个解决方案太简单了,我不太理解一些东西。

您可以使用连接而不是子查询。通常连接比子查询快是的,我知道,但简单连接在这种情况下不起作用。请参阅下面的错误答案了解原因。不,不幸的是,答案不正确。它的作用是检查join记录,即j_arg等于两个不同的值,j_值等于两个不同的值。Ie您将检查sql语句的job->job属性。作业属性不能同时是两个对象,因此它总是失败。不知道这是否解释得很好,但基本上不起作用:?
jpid,jid,j_arg,j_value
jid: 1
j_ref: AB12345
jpid: 1, jid: 1, j_arg: address_1, j_value: 123 somewhere street
jpid: 2, jid: 1, j_arg: address_2, j_value: some lovely town
jpid: 3, jid: 1, j_arg: salary, j_value: 50000
jpid: 4, jid: 1, j_arg: job_type, j_value: permanent
....
SELECT 
  j.jid 
FROM 
  job j
  JOIN jop_properties jp ON j.jid = jp.jid
WHERE 
     ( j_arg = 'salary'    AND j_value > '40000'            )
  OR ( j_arg = 'address_2' AND j_value = 'some lovely town' )
  OR [insert more combinations here]