来自MySQL的路径报告

时间:2016-04-12 23:26:15

标签: php mysql

我有一个数据库表,可以跟踪通过php脚本触发的所有综合浏览量。该表如下所示:

  • rowid(AI)
  • USER_ID
  • PAGE_URL
  • visitor_ip
  • SESSION_ID

我希望能够查询我的表格以显示访问者在单个会话中访问X页面的路径(最多5页)"。输出将是一个在每列中都带有URL的表,因此路径按照他们访问的页面顺序从左到右,同一个session_id以某个页面结尾。

有任何线索吗?我一直在寻找一个报告工具来帮助我构建这些细分,但我没有想出任何东西,所以我试图看看是否有办法只是查询它。我想避免转向其他一些收集工具,如果可以的话,只是查询我的数据库。

3 个答案:

答案 0 :(得分:0)

这样的事情会给你你想要的东西(警告 - 未经测试):

select group_concat(page_url order by rowid separator '->'),session_id 
from pageviews group by session_id

答案 1 :(得分:0)

一个想法是在选择列表中使用相关子查询。

如果我理解了规范,那么查询的参数(参数)将是一个特定的`page_url`,在规范中给定为“X”。

外部查询将检索该page_url的行。 SELECT列表中的子查询将获得会话中的先前page_url。 (我们没有看到日期时间/时间戳,因此我们需要依赖于`rowid`的值增加后续页面视图(即前一页面视图将具有“row_id”的“较低”值。

这样的事情:

SELECT ( SELECT p5.page_url
           FROM pageviews p5
          WHERE p5.session_id = t.session_id
            AND p5.rowid < t.rowid
          ORDER BY p5.rowid DESC
          LIMIT 4,1
       ) AS back_5_page_url

     , ( SELECT p4.page_url 
           FROM pageviews p4
          WHERE p4.session_id = t.session_id
            AND p4.rowid      < t.rowid
          ORDER BY p4.rowid DESC
         LIMIT 3,1
      ) AS back_4_page_url

     , ( SELECT p3.page_url
           FROM pageviews p3
          WHERE p3.session_id = t.session_id
            AND p3.rowid      < t.rowid
          ORDER BY p3.rowid DESC
          LIMIT 2,1
       ) AS back_3_page_url

     , ( SELECT p2.page_url
           FROM pageviews p2
          WHERE p2.session_id = t.session_id
            AND p2.rowid      < t.rowid
          ORDER BY p2.rowid DESC
          LIMIT 1,1
       ) AS back_2_page_url

     , ( SELECT p1.page_url
           FROM pageviews p5
          WHERE p1.session_id = t.session_id
            AND p1.rowid      < t.rowid
          ORDER BY p1.rowid DESC
          LIMIT 0,1
       ) AS back_1_page_url

     , t.page_url
     , t.session_id
     , t.row_id
  FROM pageviews t
 WHERE t.page_url = 'X'

这些子查询将由外部查询返回的每个行执行,因此这可能会在性能方面吃掉我们的午餐。如果没有合适的指数,它也会吃掉我们的午餐盒。

对于子查询,我们需要索引...

ON网页浏览量(session_id,row_id,page_url)

外部查询将受益于索引......

ON网页浏览量(page_url,row_id,session_id)

作为开始使用其他方法的想法,如果我们获得了每个page_url的路径,而不仅仅是特定的路径......

SET group_concat_max_len = 524288 ;

SELECT t.session_id
     , t.page_url
     , SUBSTRING_INDEX(
         GROUP_CONCAT(t.page_url SEPARATOR '\t' ORDER BY t.rowid DESC)
       ,'\t',6) AS `last_5_pages`
  FROM pageviews t
 GROUP
    BY t.session_id
     , t.page_url
HAVING t.page_url = 'X'

这假设page_url不包含制表符(0x09)字符。

last_5_pages列将是以制表符分隔的page_url列表,首先是最新的页面视图,然后是之前查看过的page_url等。

将那些拆分为单独的列会更有效,将该查询包装在内联视图中,并将SUBSTRING_INDEX(可能是REVERSE)的某种组合包装起来,以及计算列表中page_url数量的函数...讨厌在SQL中做。如果我采用这种方法,我更愿意处理从客户端的制表符分隔列表中解析出page_url。

答案 2 :(得分:0)

这是我最终做的事情 - 工作得很好。

<?php
require_once 'init.php';
// ----------------- PAGE PATH REPORT
$html = "<table>";
$html .= "<tr><th align='left'>PAGE PATHS HITTING GOAL.PHP</th></tr>";
$paths = array();
$sql = "SELECT cookie_uid, page_url FROM pageviews ORDER BY rowid";
$result = mysqli_query($conn, $sql);
$got_rows = mysqli_num_rows($result);

if ($got_rows) {
    while ($row = mysqli_fetch_array($result)) {
        // Create an array for the cookie_uid if it doesn't exist yet

        if ( ! array_key_exists($row['cookie_uid'], $paths) || ! is_array($paths[$row['cookie_uid']])) {
            $paths[$row['cookie_uid']] = [];
        }

        // Add to the array now that we know it exists
        array_push($paths[$row['cookie_uid']], $row['page_url']);
    }

    foreach ($paths as $session => $page) {
        $html .= "<tr>";
        $html .= '<td>' . implode('  --->   ', $page) . "</td>";
        $html .= "</tr>";
    }

} else {
    $html .= '<td colspan="2">No results</td>' . "";
}

$html .= "</table>";
echo $html;

if (!mysqli_query($conn,$sql))  {
    die('Error: ' . mysqli_error($conn));
}

// ----------------- ALL PAGES REPORT
echo "</br></br>";
echo "<tbody><table>";
echo "<tr><th align='left'>UNIQUE PAGES</th></tr>";
$sql = "SELECT distinct page_url FROM pageviews";
$allpages = mysqli_query($conn, $sql);
foreach ($allpages as $page){
    echo "<tr>";
    echo "<td>" . $page['page_url'] . "</td>";
    echo "</tr>";
}

echo "</tbody></table>";
mysqli_close($conn);
error_reporting(E_ALL);
?>

这给了我这个:

/analytics/testpage.php ---&gt; /analytics/testpage2.php ---&gt; /analytics/goal.php