我试图通过分解它来确切地解决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
?
答案 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;从我们的角度来看。但是你应该很容易确认。