2015-07-02 50 views
0

我正在努力解決SQL 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_leadcd_lead_detail

+2

正在運行或發出錯誤 –

+1

由於格式不佳導致混淆,因此我不確定整理它是否是一個好主意,@Kritner。通常,我會在代碼中單獨提問。 – TRiG

+2

@TRiG在我更新格式時我不確定那是否是*在問題中的混淆。否則,我會像你一樣在我的答案中完成它。隨意回滾。 – Kritner

回答

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,但只要字段名稱對於一個表是唯一的,這實際上不是必需的。因此,無法知道該列(或沒有表名前綴的其他列)是從哪個表開始學習此查詢。當然,從數據庫結構的角度來看,很容易看清楚。

+0

感謝您的理解,重新格式化查詢可以讓您更容易理解 – fightstarr20

+1

@ fightstarr20。 。 。有趣。我沒有看到這個版本比你的問題中的版本更容易理解。 –

+1

@戈登林諾夫。嘗試查看問題上的編輯歷史記錄。 – TRiG

2
WHERE cb_lead.form_id = '$form_id' 

獲取與$ form_id

AND date_created BETWEEN DATE_SUB(NOW(), INTERVAL 14 DAY) AND NOW() 

一個form_id和記錄,其中創建日期是天14年前之間僅有的形式,現在

AND field_number = '23' 

和field_number是23

是否說'如果field_number是23'?

這的確是它的意思。

另外,它在哪裏尋找field_number?它是cb_lead還是cd_lead_detail?

取決於哪個表具有該特定列。如果這兩個表中的都有該列,則該查詢將無法執行「模糊列錯誤」或類似行爲。如果查詢成功執行,那麼該列僅存在於查詢中的兩個表中的一個上......但由於您沒有提供這兩個表的模式,因此無法從我們的角度說出它所在的表。但是,您應該很容易確認。