2012-11-07 61 views
0

對於一個好的MySQL編碼器來說,這是一個挑戰。 我們將非常感謝一個查詢創建一個HTML/PHP頁面中顯示的MySQL報告的幫助。對MySQL/PHP報告有挑戰性的MySQL查詢

我們知道如何收集數據並存儲它,並且擁有PHP報表佈局,但是如何構造查詢卻丟失了。

我們有兩個MySQL表 - 「訪問者」和「買家」。

  1. 參觀者表 - 爲遊客到我們的網站,通過該標識SALES_REP和他們自己創建許多 營銷代碼一個 特定的URL來英寸
  2. 買家表 - 爲那些買東西的人。

訪問者可以通過下面的鏈接訪問我們的網站,例如:

www.sales_rep.website.com/index.php?marketing=code1/code2/code3 

在 「遊客」 表中,我們包括三個領域:

  • SALES_REP
  • 日期
  • marketing_CODE - (在這種情況下,它將是字符串中的「code1/code2/code3」,但每個sales_rep可能有多個基於其廣告活動的marketing_CODES;例如「code1a/codeTX/codeM2」和「mark ET-Z /廣告-123" )

當訪問者購買的東西,我們將它們添加到 「買方」 表,其中包括:

  • SALES_REP
  • 日期
  • marketing_TYPE - (它可以是 「URL」, 「推薦」,或一些其他類型)
  • marketing_VALUE - (它將如果marketing_TYPE是URL的marketing_CODE)

我們需要看到每個特定銷售代表的報告,對於任何指定月份,按市場代碼排序,僅針對marketing_TYPE ==「URL」。

此報告需要顯示每個marketing_CODE觀衆和買家的活動爲期一週的逐周細目如下:

Table Example

爲了保證清晰度,在上表中,在第1周, 8訪客通過「code1/code2 /」鏈接進入該網站,其中5人購買了一些東西。

我們已經嘗試開始我們的查詢與以下,但不知道去哪裏吧:

  1. $chosen_month = $_POST['chosen_month'];
  2. SELECT * FROM visitors INNER JOIN buyers ON sales_rep WHERE marketing_type = "URL" AND sales_rep = '$sales_rep' AND date('Y-m') = $'chosen_month' ;
  3. 使用while語句,我們將生成查找每個記錄的表格單元格。使用這種方法,我們知道如何列出每條記錄,但我們無法弄清楚如何顯示非獨特記錄一次,顯示它們的計數,然後顯示不同的記錄。

謝謝你的時間和幫助。

+0

無論你在這裏做什麼,那就[逃脫適當的SQL]受益於一些(http://bobby-tables.com/php )。將'$ _POST'值直接注入到查詢中是一個**非常糟糕的IDEA **。 – tadman

+0

感謝您的信息。我剛開始學習防止SQL注入。當變量實際上是在PHP中創建的,我們將使用mysql_real_escape_string函數來保護數據。該帖子來自一個下拉菜單,所以這應該足以保證它,對吧? – furosiandragon

+0

儘管如此,您必須對任何和所有值使用'mysql_real_escape_string'。確保你擁有每個人都是一個挑戰,這就是爲什麼使用[PDO](http://net.tutsplus.com/tutorials/php/why-you-should-be-using-phps-pdo -for-database-access /)而不是已棄用的'mysql_query'界面。請務必使用[SQL注入測試工具](http://sqlmap.org/)測試您的應用程序,以確保您沒有完全暴露。 – tadman

回答

1

這是我對你的查詢的建議。

首先,我需要根據日期字段,找出週數,所以我用在this question答案:

SELECT WEEK(dateField, 5) - 
     WEEK(DATE_SUB(dateField, INTERVAL DAYOFMONTH(dateField) - 1 DAY), 5) + 1 

我指的是上面@week的結果從現在開始,使事情變得更加可讀:)

於是,我開始了表的只有一個,想看看一個銷售代表在每個月多少訪問者有:

select rep, 
    , SUM(CASE @week WHEN 1 THEN 1 ELSE 0 END) as Week1 
    , SUM(CASE @week WHEN 2 THEN 1 ELSE 0 END) as Week2 
    , SUM(CASE @week WHEN 3 THEN 1 ELSE 0 END) as Week3 
    , SUM(CASE @week WHEN 4 THEN 1 ELSE 0 END) as Week4 
    , COUNT(*) as Total 
from visitors 
group by rep 

現在,我們得到了這個信息,我們將使用買家相同,然後加入這兩個子查詢的結果如下:

select v.rep 
, v.Week1 , b.Week1 
, v.Week2 , b.Week2 
, v.Week3 , b.Week3 
, v.Week4 , b.Week4 
, v.Total, b.Total 
from (
    select rep, 
     , SUM(CASE @week WHEN 1 THEN 1 ELSE 0 END) as Week1 
     , SUM(CASE @week WHEN 2 THEN 1 ELSE 0 END) as Week2 
     , SUM(CASE @week WHEN 3 THEN 1 ELSE 0 END) as Week3 
     , SUM(CASE @week WHEN 4 THEN 1 ELSE 0 END) as Week4 
     , COUNT(*) as Total 
    from visitors 
    group by rep) as v 
    left join (select rep, 
       , SUM(CASE @week WHEN 1 THEN 1 ELSE 0 END) as Week1 
       , SUM(CASE @week WHEN 2 THEN 1 ELSE 0 END) as Week2 
       , SUM(CASE @week WHEN 3 THEN 1 ELSE 0 END) as Week3 
       , SUM(CASE @week WHEN 4 THEN 1 ELSE 0 END) as Week4 
       , COUNT(*) as Total 
       from visitors 
       group by rep) as b on v.rep = b.rep 

這應該是你在找什麼!

這裏是如上更新您的具體情況相同的代碼:

select v.rep 
    , v.Week1 , b.Week1 
    , v.Week2 , b.Week2 
    , v.Week3 , b.Week3 
    , v.Week4 , b.Week4 
    , v.Total, b.Total 
from (
     select rep 
      , SUM(CASE WEEK(the_date, 5) - 
      WEEK(DATE_SUB(the_date, INTERVAL DAYOFMONTH(the_date) - 1 DAY), 5) + 1 
      WHEN 1 THEN 1 ELSE 0 END) as Week1 
     , SUM(CASE WEEK(the_date, 5) - 
      WEEK(DATE_SUB(the_date, INTERVAL DAYOFMONTH(the_date) - 1 DAY), 5) + 1 
      WHEN 2 THEN 1 ELSE 0 END) as Week2 
     , SUM(CASE WEEK(the_date, 5) - 
     WEEK(DATE_SUB(the_date, INTERVAL DAYOFMONTH(the_date) - 1 DAY), 5) + 1 
      WHEN 3 THEN 1 ELSE 0 END) as Week3 
     , SUM(CASE WEEK(the_date, 5) - 
     WEEK(DATE_SUB(the_date, INTERVAL DAYOFMONTH(the_date) - 1 DAY), 5) + 1 
      WHEN 4 THEN 1 ELSE 0 END) as Week4 
     , COUNT(*) as Total 
     from visitors 
     where sales_rep = '$sales_rep' AND date('Y-m') = $'chosen_month' 
     group by rep) as v 
    left join (
     select rep 
      , SUM(CASE WEEK(the_date, 5) - 
      WEEK(DATE_SUB(the_date, INTERVAL DAYOFMONTH(the_date) - 1 DAY), 5) + 1 
      WHEN 1 THEN 1 ELSE 0 END) as Week1 
     , SUM(CASE WEEK(the_date, 5) - 
      WEEK(DATE_SUB(the_date, INTERVAL DAYOFMONTH(the_date) - 1 DAY), 5) + 1 
      WHEN 2 THEN 1 ELSE 0 END) as Week2 
     , SUM(CASE WEEK(the_date, 5) - 
     WEEK(DATE_SUB(the_date, INTERVAL DAYOFMONTH(the_date) - 1 DAY), 5) + 1 
      WHEN 3 THEN 1 ELSE 0 END) as Week3 
     , SUM(CASE WEEK(the_date, 5) - 
     WEEK(DATE_SUB(the_date, INTERVAL DAYOFMONTH(the_date) - 1 DAY), 5) + 1 
      WHEN 4 THEN 1 ELSE 0 END) as Week4 
     , COUNT(*) as Total 
     from buyers 
     where marketing_type = "URL" AND sales_rep = '$sales_rep' AND date('Y-m') = $'chosen_month' 
     group by rep) as b on v.rep = b.rep 
+0

感謝您的回覆。該代碼似乎正在工作,但我無法獲得任何數據顯示。我正在使用while循環從查詢中提取變量,並且我沒有收到來自PHP或MySQL的任何錯誤。我應該使用不同的方法來提取數據嗎? – furosiandragon

+0

首先,您應該嘗試直接在sql中運行您的查詢 - 爲此使用Phpmyadmin或Mysql Workbench。一旦確定結果符合預期,那麼您應該嘗試在代碼中使用查詢。 – Corina

+0

另外,我看到我爲日期列使用了不同的名稱:「the_date」而不是「date」,就像您在示例中所使用的名稱一樣。而且你使用的「date('Y-m')= $'chosen_month'」的條件將不會起作用,因爲它不會被'date'列過濾 - 這裏'date'是一個函數。 – Corina