我有一个数据库表,可以跟踪通过php脚本触发的所有综合浏览量。该表如下所示:
我希望能够查询我的表格以显示访问者在单个会话中访问X页面的路径(最多5页)"。输出将是一个在每列中都带有URL的表,因此路径按照他们访问的页面顺序从左到右,同一个session_id以某个页面结尾。
有任何线索吗?我一直在寻找一个报告工具来帮助我构建这些细分,但我没有想出任何东西,所以我试图看看是否有办法只是查询它。我想避免转向其他一些收集工具,如果可以的话,只是查询我的数据库。
答案 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