Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
挑战针对html/PHP报告的MySQL查询_Php_Html_Mysql - Fatal编程技术网

挑战针对html/PHP报告的MySQL查询

挑战针对html/PHP报告的MySQL查询,php,html,mysql,Php,Html,Mysql,对于一个好的MySQL程序员来说,这里有一个挑战。 如果您能提供一些帮助,帮助我们创建一个显示在html/PHP页面中的MySQL报告,我们将不胜感激 我们知道如何收集和存储数据,并拥有PHP报告布局,但却不知道如何构造查询 我们有两个MySQL表——“访客”和“买家” 访客表–用于通过 标识销售代表和众多销售代表之一的特定URL 他们自己创造的营销代码 买家表–针对购买物品的人 访客可通过以下链接访问我们的网站,例如: www.sales_rep.website.com/index.php?m

对于一个好的MySQL程序员来说,这里有一个挑战。 如果您能提供一些帮助,帮助我们创建一个显示在html/PHP页面中的MySQL报告,我们将不胜感激

我们知道如何收集和存储数据,并拥有PHP报告布局,但却不知道如何构造查询

我们有两个MySQL表——“访客”和“买家”

  • 访客表–用于通过 标识销售代表和众多销售代表之一的特定URL 他们自己创造的营销代码
  • 买家表–针对购买物品的人 访客可通过以下链接访问我们的网站,例如:

    www.sales_rep.website.com/index.php?marketing=code1/code2/code3
    
    在“访客”表中,我们包括三个字段: 销售代表
  • 日期
  • 市场营销代码–(在本例中为字符串中的“code1/code2/code3”,但每个销售代表可以根据其广告活动拥有多个市场营销代码,如“code1a/codeTX/codeM2”和“market-z/ad-123”)
  • /ul>

    当访客购买物品时,我们会将其添加到“买家”表中,该表包括:

    销售代表
  • 日期
  • 营销类型–(可以是“URL”、“推荐”或其他类型)
  • marketing_VALUE–(如果marketing_类型为URL,则将显示marketing_代码)
  • 我们需要查看每个特定销售代表在任何指定月份的报告,按营销代码排序,仅针对营销类型==“URL”

    本报告需要显示每个营销代码的访客和买家活动的每周细分情况,如下所示:

    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
    

    为了确保清晰,在上表中,在第1周,8名访问者通过“code1/code2/”链接进入网站,其中5人购买了一些东西

    我们试图从以下内容开始查询,但不知道该从何处开始:

  • $selected\u month=$\u POST['selected\u month']
  • SELECT*FROM visitors internal JOIN buyer ON sales_rep,其中marketing_type=“URL”和sales_rep='$sales_rep'和date('Y-m')=$'selected_month'
  • 使用while语句,我们将为找到的每个记录生成表单元格。使用它,我们知道如何列出每一条记录,但我们无法弄清楚如何一次显示非不同的记录,显示它们的计数,然后显示不同的记录

  • 感谢您的时间和帮助。

    以下是我对您的问题的建议

    首先,我需要根据日期字段找出周数,因此我在中使用了答案:

    从现在起,我将上述结果称为@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
    

    无论你在这里做什么,都会从中受益。将
    $\u POST
    值直接注入到查询中是一个非常糟糕的主意。感谢您提供的信息。我刚刚开始学习如何防范sql注入。在PHP中实际创建变量时,我们将使用mysql\u real\u escape\u string函数来保护数据。这篇文章来自一个下拉菜单,所以这应该足以保护它,对吗?不过,您必须对任何和所有值使用
    mysql\u real\u escape\u string
    。要确保您拥有每一个查询,这可能是一个挑战,这就是为什么使用而不是不推荐的
    mysql\u查询
    接口的原因。请务必使用测试工具测试您的应用程序,以确保您没有完全暴露。再次感谢。我一定会仔细阅读PDO。我们的大部分代码都是使用
    mysql\u query
    编写的。它和PDO之间的语法有多不同?感谢您的回复。代码似乎正在运行,但我无法获取任何要显示的数据。我使用while循环从查询中提取变量,并且没有收到来自PHP或MySQL的任何错误。我应该使用另一种方法来提取数据吗?首先,您应该尝试直接在sql中运行查询——为此,请使用Phpmyadmin或Mysql Workbench。一旦确定结果符合预期,就应该尝试在代码中使用查询。此外,我看到我对日期列使用了不同的名称:“the_date”而不是示例中的“date”。您使用的条件“date('Y-m')=$'Selected_month'”将永远不会起作用,因为它不会按
    date
    列过滤-此处
    date
    是一个函数。非常感谢!在比较之前,我将日期更改为日期\格式函数。经过一点清理,一切都很顺利。