SELECT DISTINCT,尝试从连接中拉出,需要独特的结果

时间:2015-03-04 17:26:30

标签: mysql select distinct

有两个表格存在问题; leadscontactAttempts

我正在尝试提取2012年与之联系的不同潜在客户,并在单独的表格中使用文本列中的特定关键字。

问题在于我一遍又一遍地得到相同的领导者,结果是如此巨大,以至于它超时并且崩溃了网站。

我尝试过多种变体,包括一个sql语句。将它们分成2个sql语句是我最近的尝试。

Select distinct目前无法使用我正在尝试的格式。 id是两个表中的主要内容,leadIDleadscontactAttempts连接起来:

<? $sql="SELECT * 
 FROM contactAttempts a
 JOIN leads l
 ON l.id = a.leadID  
 WHERE l.agentID = 2 
 AND l.leadType IN(0,2)
 AND a.timestamp BETWEEN '2012-01-01 00:00:00' AND '2012-12-31 23:59:59' 
 LIMIT 0,50";
$res=mysql_query($sql);
while($row=mysql_fetch_assoc($res)){
    $sql2="SELECT DISTINCT leadID FROM contactAttempts WHERE 
leadID='$row[id]' AND (contactAttempts.notes LIKE '%shown%' OR 
contactAttempts.notes LIKE '%showed%' OR contactAttempts.notes LIKE 
'%offer%' OR contactAttempts.notes LIKE '%inspection%' OR 
contactAttempts.notes LIKE '%appraisal%' OR contactAttempts.notes LIKE 
'%closing%' OR contactAttempts.notes LIKE '%drive%' OR 
contactAttempts.notes LIKE '%drove%' OR contactAttempts.notes LIKE '%car%' 
OR contactAttempts.notes LIKE '%preview%' OR contactAttempts.notes LIKE 
'%previewed%' OR contactAttempts.notes LIKE '%took pictures%') LIMIT 1";
    $res2=mysql_query($sql2);$x=0;
    while($row2=mysql_fetch_assoc($res2)){
        $x++;
        echo $x.' - '.$row2['leadID'];
        echo '<br />';
    }
} ?>

这是一个源代码示例: 表格主管:

id - 100,其他一些对此脚本无用的列

id - 200,其他一些对此脚本无用的列

表contactAttempts:

id - 1,leadID - 100,备注 - '向客户展示房屋,他们喜欢它',时间戳 - '2012-01-21 12:05:11'

id - 2,leadID - 100,注意 - '再次向客户展示房屋,他们喜欢它',时间戳 - '2012-02-21 12:05:11'

id - 3,leadID - 200,注意 - “向不同的客户展示房屋,他们讨厌它”,时间戳 - “2012-01-21 12:05:11”

目前,结果将是:100,100,200。我需要的结果是100,200。该脚本需要省略多次出现的leadID 100。

2 个答案:

答案 0 :(得分:1)

<? 
$sql="
 SELECT 
    l.id as id,
    a.id as attempt_id,
    a.leadID as leadID,
 FROM leads l
 INNER JOIN (
     SELECT id, leadID
     FROM contactAttempts 
     WHERE contactAttempts.notes REGEXP 'shown|showed|offer|inspection|appraisal|closing|drive|drove|car|preview|previewed|took pictures' 
     AND timestamp BETWEEN '2012-01-01 00:00:00' AND '2012-12-31 23:59:59'
    ) as a
 ON a.leadID = l.id
 WHERE l.agentID = 2 
   AND l.leadType IN(0,2)
 ORDER BY l.id, a.id
 ";
$res=mysql_query($sql);
$currLead = 0;
$x=0;
while($row=mysql_fetch_assoc($res)){
    if ($currLead != $row['leadID']){
        echo 'NEW DISTINCT LEAD = '.$row['leadID'].'<br />';
        $x=0;
    }
    $x++;
    echo $x.' of lead '.$row['leadID'].'  attempt '.$row['attempt_id'];
    echo '<br />';
    $currLead = $row['leadID'];
} ?>

答案 1 :(得分:0)

在我(或其他人)解决实际问题之前;对您的第一次查询提出一些意见。

首先,该查询(我相信)在逻辑上与以下相同,我觉得更容易阅读:

SELECT * 
  FROM contactAttempts a
  JOIN leads l
    ON l.id = a.leadID  
 WHERE l.agentID = 2 
   AND l.leadType IN(0,2)
   AND YEAR(a.timestamp) = 2012 
 LIMIT 0,50

其次,YEAR()会阻止使用索引,因此对于较大的数据集,这会大大减慢速度。 a.timestamp BETWEEN '2012-01-01 00:00:00' AND '2012-12-31 23:59:59'可能看起来很麻烦,但索引数据会快得多。

第三,没有ORDER BY的LIMIT几乎没有意义。

此外,同样,LIKE '%...'无法使用索引,但LIKE '...%'可以