循环查询,即使它找到匹配

时间:2014-12-18 13:37:30

标签: mysql sql

让我说我有这些价值观:

id       info          date
---------------------------------
1        hi            2014-02-15
2        something     2014-10-30
1        hi            2014-12-01

正如你所看到的,我有两个身份#1。如果我要求查询找到自3个月前以来未导出的任何内容(日期)。 #1仍将通过,即使它是在12月首次出口。只是因为它找到了2月15日导出的那个,然后它完成了查询,因为它实际上找到了匹配。

你如何这样做,以便查询遍历所有内容,以便考虑所有匹配?

我现在使用的查询(不是它会有很大的帮助):

//------SQL query för att se till att du inte tar ut samma lead igen-----\\
$sql = $pdo->query('SELECT p.* FROM prospects p
LEFT JOIN exported_leads e
on p.id = e.lead_id WHERE p.partner_id != '.$partner_id.' AND (e.lead_id IS NULL OR datediff(now(), e.export_date) > 90)
LIMIT '.$monthly_uttag.'');
//---------------------------------------------\\

2 个答案:

答案 0 :(得分:0)

您可以像这样使用NOT IN谓词:

SELECT *
FROM table1
WHERE id NOT IN(SELECT id 
                FROM table1
                WHERE date < DATE_SUB(now(), INTERVAL 3 MONTH))

这将忽略id 1,因为它在过去2个月的间隔内有一个日期。

子查询将获取所有在过去3个月内具有日期值的ID,然后NOT IN谓词将忽略这些值。

答案 1 :(得分:0)

不确定您的潜在客户表的布局,但您可以加入一个子查询以获取每个lead_id的最新export_date,然后检查WHERE子句中的那个: -

SELECT p.* 
FROM prospects p
LEFT JOIN 
(
    SELECT lead_id, MAX(export_date)
    FROM exported_leads 
    GROUP BY lead_id
)e
on p.id = e.lead_id 
WHERE p.partner_id != '.$partner_id.' 
AND (e.lead_id IS NULL OR datediff(now(), e.export_date) > 90)
LIMIT '.$monthly_uttag.'');

也可以使用普通连接执行此操作,并检入having子句。但阅读有点麻烦!您还应该指定要返回的潜在客户的GROUP BY中的所有字段

SELECT p.id, partner_id
FROM prospects p
LEFT JOIN exported_leads e
on p.id = e.lead_id 
WHERE p.partner_id != '.$partner_id.' 
GROUP BY p.id, partner_id
HAVING (e.lead_id IS NULL OR datediff(now(), MAX(e.export_date) > 90))
LIMIT '.$monthly_uttag.'');