【问题标题】:MySQL multiple joins to same tableMySQL多个连接到同一个表
【发布时间】:2012-04-12 13:34:56
【问题描述】:

我正在尝试提高一个程序的性能,该程序跟踪通过网站采用的最流行路径。给定的 URL 在表 sessionpage 中注册,具有 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 |
+-------+-------+-------+-------+

提前致谢。

【问题讨论】:

  • 第二张表的unique_id上​​是否有索引?
  • 不,但有可能。目前,unique_id 是会话的主键。每个可能的 URL 组合都有自己的 unique_id。
  • 我不明白您为什么需要多次加入。似乎您的表结构的方式是您可以通过一次连接获得所有信息。多个联接无助于提高性能。请说明您希望最终结果的样子。
  • Erica - 所以你是说 unique_id 对你的 sessionpage 表中的 URL 不是唯一的? (换句话说,您在该表中的多个 ID 下具有相同的 URL)
  • 我更新了帖子以更加清晰。 sessionpage unique_id 是唯一的(每个 id 只映射一个 URL,每个 URL 也只有一个 id)。 unique_id 在会话中多次显示,在 page1、page2、page3、page4、page5 (一个或多个)下。

标签: mysql join


【解决方案1】:

根据您的评论,page1, page2.. 是外键列,我认为这很简单。

类似:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-15
    • 2018-12-19
    • 2018-07-06
    • 1970-01-01
    • 1970-01-01
    • 2011-10-18
    • 1970-01-01
    相关资源
    最近更新 更多