SQL中的AND语句使我感到困惑

时间:2015-07-02 14:18:31

标签: mysql sql

我试图通过分解它来确切地解决SQL查询正在做什么。查询如下所示:

select count(*) as totalvaluecount,  value as thevalue, DATE(date_created) as thedate
            FROM cb_lead INNER JOIN cb_lead_detail ON cb_lead.id = cb_lead_detail.lead_id
            WHERE cb_lead.form_id = '$form_id' AND date_created BETWEEN DATE_SUB(NOW(), INTERVAL 14 DAY)
            AND NOW() AND field_number = '23' GROUP BY thevalue, thedate

AND field_number = '23'行令我困惑。这个条款做了什么?它是否说'如果field_number是23'?

此外,它在哪里寻找field_number?是在cb_lead还是cd_lead_detail

2 个答案:

答案 0 :(得分:4)

我会稍微不同地格式化该查询,这会(我认为)使其更容易阅读:

SELECT
        COUNT(*) AS totalvaluecount,
        value AS thevalue,
        DATE(date_created) AS thedate
FROM
        cb_lead
INNER JOIN
        cb_lead_detail
        ON cb_lead.id = cb_lead_detail.lead_id
WHERE
        cb_lead.form_id = '$form_id'
        AND date_created BETWEEN DATE_SUB(NOW(), INTERVAL 14 DAY) AND NOW()
        AND field_number = '23'
GROUP BY
        thevalue,
        thedate

您要问的部分是AND field_number = '23'。是的,这是WHERE子句的一部分,因此您推测,它将结果集限制为field_number列的值为23的记录。

查询是在两个连接的表上。在这种情况下,通常将列表示为table_name.field_name,但实际上这不是必需的,只要字段名称对于一个表是唯一的。所以没有办法知道这个列(或没有表名前缀提到的其他列)只是在研究这个查询。当然,通过一瞥数据库结构可以很容易地看出它。

答案 1 :(得分:2)

WHERE cb_lead.form_id = '$form_id' 

仅获取form_id为$ form_id

的表单
    AND date_created BETWEEN DATE_SUB(NOW(), INTERVAL 14 DAY) AND NOW() 

并记录创建日期的时间是14天前和现在

    AND field_number = '23' 

,field_number为23

  

是否说'field_number是23'?

确实就是这么说的。

  

此外,它在哪里寻找field_number?是cb_lead还是cd_lead_detail?

取决于哪个表具有该特定列。如果表的两个都有该列,则此查询将无法执行"模糊列错误"或类似的。如果查询成功执行,那么该列仅存在于查询中的两个表中的一个表中...但由于您没有提供这两个表的模式,因此无法确定哪个表和#39;从我们的角度来看。但是你应该很容易确认。