MySQL多个连接到同一个表

时间:2012-03-28 22:04:52

标签: mysql join

我正在尝试提高跟踪网站上最流行路径的程序的性能。给定的URL在表会话页面中使用unique_id注册:

+-----------+--------------------------+---------------------+
| unique_id | page_url                 | mod_date_stamp      |
+-----------+--------------------------+---------------------+
|      2378 | /resources/series75.html | 2008-10-03 22:49:00 |
+-----------+--------------------------+---------------------+

然后另一个表session,使用sessionpage中的unique_id计算一组最多5个url的命中数。

会话

+-----------+---------+-----------------+-----------+---------------------+-------
| unique_id | counter | sequence_length | yearmonth | mod_date_stamp      | page1 | 
+-----------+---------+-----------------+-----------+---------------------+-------
|         1 |       2 |               2 |    201203 | 2012-03-28 15:42:38 |  5298 |  
+-----------+---------+-----------------+-----------+---------------------+-------

+-------+-------+-------+-------+
page2 | page3 | page4 | page5 |
+-------+-------+-------+-------+
6075 |     0 |     0 |     0 |
+-------+-------+-------+-------+

现在,统计程序正在从每个URL的会话页面获取unique_id,这花费的时间太长了。我想多次将sessionpage加入会话,以便page1 - page5字段显示url路径(或0 / null)而不是sessionpage中的unique_id来加速程序。

最终结果如下:

+-----------+---------+-----------------+-----------+---------------------+-------
| unique_id | counter | sequence_length | yearmonth | mod_date_stamp      | page1 | 
+-----------+---------+-----------------+-----------+---------------------+-------
|         1 |       2 |               2 |    201203 | 2012-03-28 15:42:38 |  /path/index.html |  
+-----------+---------+-----------------+-----------+---------------------+-------

+-------+-------+-------+-------+
page2            | page3 | page4 | page5 |
+-------+-------+-------+-------+
/path3/disk.html |     0 |     0 |     0 |
+-------+-------+-------+-------+

提前致谢。

1 个答案:

答案 0 :(得分:1)

根据你的评论第1页,第2页..是外键列,我认为这很简单。

类似的东西:

SELECT 
    s.unique_id, s.counter, s.sequence_length, s.yearmonth, 
    s.mod_date_stamp,
    pg1.page_url as page1, pg2.page_url as page2, 
    pg3.page_url as page3, pg4.page_url as page4, 
    pg5.page_url as page5
FROM 
    session s
LEFT JOIN 
    sessionpage pg1 ON pg1.unique_id = s.page1 
LEFT JOIN 
    sessionpage pg2 ON pg2.unique_id = s.page2
LEFT JOIN 
    sessionpage pg3 ON pg3.unique_id = s.page3
LEFT JOIN 
    sessionpage pg4 ON pg4.unique_id = s.page4
LEFT JOIN 
    sessionpage pg5 ON pg5.unique_id = s.page5

我认为这会奏效。

但是当列(表会话)上没有值时,应该使用null而不是0(零)。

另一个提示,在SELECT语句中,如果你不想要NULL值,你可以使用:

COALESCE(pg5.page_url, ' ') as page5