【问题标题】:Mysql select statement with 1-to-many tables具有一对多表的Mysql select语句
【发布时间】:2012-07-11 18:36:50
【问题描述】:

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

我已简化下表,仅显示核心属性。

我有一个主表(一份工作)

工作

jid, j_ref

然后这会链接到包含所有作业属性的第二个表

工作属性

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
....

所以作业 1 (jid=1) 具有这 4 个属性(jpid 只是一个唯一的自动增量 ID)。

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

我目前对这个问题进行编码的方式是有多个 IN 子句,它们会产生如下内容:

select j.jid from job j where
jid in (select jid from job_properties where j_arg='salary' and j_value > '40000')
and
jid in (select jid from job_properties where j_arg='address_2' and j_value='some lovely town') ... (insert more IN clauses for each value that is passed to the search)

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

不过我觉得这样效率很低,而且当我开始接收大量搜索时,它真的会变慢(一个工作可以有 20-30 个属性)。

有没有更好的方法来做到这一点,也许使用 HAVING 和 group by's?

类似于这个问题:Select mysql data with where clause in 2 tables,但我还需要查询另一个表中的参数,而不仅仅是属性。

提前致谢

尼克

P.S 我不能缓存结果,也不用担心创建开销,因为显然结果取决于搜索时数据库中的作业,并且每小时都会更改。

【问题讨论】:

  • 您可以使用联接而不是子查询。通常连接比子查询快
  • 是的,我知道,但是在这种情况下,简单的连接不起作用。请参阅下面的(不正确的)答案了解原因。

标签: php mysql


【解决方案1】:

这是否会实现您的目标?

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]

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

【讨论】:

  • 不,不幸的是它没有。这是什么检查连接记录 j_arg 等于两个不同的东西,j_value 等于 2 个不同的东西。即你会得到工作-> 检查该 sql 语句的工作属性。工作属性不能同时是两个东西,所以它总是失败。不知道这是否解释得很好,但基本上它不起作用:?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-03-12
  • 1970-01-01
  • 2014-08-19
  • 2021-03-24
  • 1970-01-01
  • 1970-01-01
  • 2013-04-05
相关资源
最近更新 更多