0
SELECT 
    j.* , 
    month(j.create_date) as month 
FROM tbl_jobs AS j 
LEFT JOIN tbl_well_data AS wd 
    on j.id = wd.job_id 
LEFT JOIN tbl_well_depth AS wdp 
    on j.id = wdp.job_id 
LEFT JOIN tbl_well_formation AS wf 
    on j.id = wf.job_id 
LEFT JOIN tbl_well_tubing_size AS wts 
    on j.id = wts.job_id 
LEFT JOIN tbl_pumping AS p 
    on j.id = p.job_id 
LEFT JOIN tbl_pumping_puid AS pf 
    on j.id = pf.job_id 
WHERE j.create_date >= '2013-04-01' 
AND j.create_date <= '2013-04-25' 
AND ( pf.puid_id = 109 AND pf.volume BETWEEN 1 AND 2000 AND pf.corrosive = 1 AND pf.bh = 0 AND pf.ct = 1 ) 
AND ( pf.puid_id = 112 AND pf.volume BETWEEN 1 AND 2000 AND pf.corrosive = 1 AND pf.bh = 0 AND pf.ct = 1 ) 
AND FIND_IN_SET('1',j.services)

AND当我使用此结果时,使用多个结果时的查询问题显示为空,但我希望pf.puid_id = 112 AND pf.puid_id = 109相应地出现,并且这些 puid_id 存在于我的数据库表中,那么为什么会出现此问题?

当我使用 OR 时,结果仅基于 onpf.puid_id = 112pf.puid_id = 109

4

3 回答 3

0
 WHERE j.create_date >= '2013-04-01' 
    AND j.create_date <= '2013-04-25' 
    AND (( pf.puid_id = 109 OR pf.puid_id = 112)
       AND pf.volume BETWEEN 1 AND 2000 
       AND pf.corrosive = 1 AND pf.bh = 0 AND pf.ct = 1 )
    AND FIND_IN_SET('1',j.services)

是的。请使用或。

于 2013-04-25T06:58:02.550 回答
0

这是问题所在:

AND ( pf.puid_id = 109 AND pf.volume BETWEEN 1 AND 2000 AND 
                             pf.corrosive = 1 AND pf.bh = 0 AND pf.ct = 1 ) 
AND ( pf.puid_id = 112 AND pf.volume BETWEEN 1 AND 2000 AND 
                             pf.corrosive = 1 AND pf.bh = 0 AND pf.ct = 1 ) 

你是说你想同时pf.puid_id等于109 和 112。我相信您的意思是它应该是两者之一,而不是同时具有两个值。

将这两行替换为:

AND ( pf.puid_id IN (109,112) AND pf.volume BETWEEN 1 AND 2000 AND 
                             pf.corrosive = 1 AND pf.bh = 0 AND pf.ct = 1 ) 

当您尝试测试某个值是否等于所需值之一时,IN 关键字是您的朋友。它使查询更短且更具可读性。

一个例子——这种情况:

WHERE id = 5 OR id = 8 OR id = 13 OR id = 21 OR id = 34

是相同的:

WHERE id IN (5,8,13,21,34)

另一个建议。代替:

j.create_date >= '2013-04-01' 
AND j.create_date <= '2013-04-25'

和:

j.create_date BETWEEN '2013-04-01' AND '2013-04-25'

两者相同且同样正确,但第二个更短且更具可读性。

于 2013-04-25T16:02:42.713 回答
0

当您对两个 puid_id 使用 AND 时,您希望同时满足两个条件的数学逻辑状态。这意味着您的查询将只匹配同时尊重这两个条件的行。

所以你应该问自己:一个东西怎么可能同时等于两个不同的东西?这就是您尝试使用 AND 执行的操作。

使用 OR 将为您提供至少匹配给定条件之一的行(在这种情况下,不可能同时满足两个条件)。

在继续之前,请考虑阅读更多基本概念。它将提高您的软件质量。

希望我有所帮助。

希望我有所帮助。

于 2013-04-25T07:09:57.917 回答