通过JOINS

时间:2018-10-25 19:55:49

标签: mysql sql postgresql

我有三个表:sessionsurlsvisitors。 我需要以这样一种方式连接这三个表,使得我应该能够从每个表中获取数据,并且返回的最大行数应等于会话数。

以下是我表的基本架构。

sessions

session_id | url_id | referrer_id | country
-------------------------------------------
  1234     |  a1b1  |    bb11     |   US
  4567     |  x1y1  |    ll33     |   IN
  6789     |  a1b1  |    ff99     |   UK

urls

  id       |        url                 |
-----------------------------------------
 a1b1      | https://url-1.com          |
 x1y1      | https://url-2.com          |
 bb11      | https://referrer-url-1.com |
 ll33      | https://referrer-url-2.com |
 ff99      | https://referrer-url-3.com |

visitors

   id      | session_id | visiting_time |
-----------------------------------------
   1       |   1234     |   447383930   |
   2       |   4567     |   547383930   |
   3       |   6789     |   647383930   |

最终输出应为

 session_id | visiting_time | url                |  referrer_url      | country
------------------------------------------------------------------------------------------
   1234     |  447383930    | https://url-1.com  | https://referrer-url-1.com | US |
   4567     |  547383930    | https://url-2.com  | https://referrer-url-2.com | IN |
   6789     |  647383930    | https://url-1.com  | https://referrer-url-3.com | UK |

我想将url_id表中的sessionsid表中的urls映射,并从url表中获取相应的urls名为url的新列中的值。同样,将referrer_id表中的sessionsid表中的urls映射,并从url表中获取相应的urls,并在新列名为referring_url

您将看到:用sessionsvisitors进行联接很简单,可以通过以下方式简单完成:

select session_id, visiting_time, country
from sessions,
     visitors
where sessions.session_id = visitors.session_id;

但是与urls表联接并获得urlreferring_url有点棘手。我已经尝试过LEFT JOININNER JOIN,但是无法正常工作。

任何有关查询或引用的帮助都会有所帮助。

谢谢!

4 个答案:

答案 0 :(得分:2)

  • 您应避免使用基于逗号的隐式联接,而应使用Explicit Join based syntax
  • 您将需要使用urls表进行两次联接;一个用于获取url,另一个用于referrer_url

尝试以下操作:

SELECT s.session_id, 
       v.visiting_time, 
       u1.url, 
       u2.url AS referrer_url, 
       s.country
FROM sessions AS s
JOIN visitors AS v ON v.session_id = s.session_id 
JOIN urls AS u1 ON u1.id = s.url_id 
JOIN urls AS u2 ON u2.id = s.referrer_id

答案 1 :(得分:1)

select sessions.session_id, visitors.visiting_time, urls.url, urlsReferrer.url referrer_url, sessions.country
from sessions
        inner join visitors on sessions.session_id = visitors.session_id
        inner join urls on sessions.url_id = url.id
        left join urls urlsReferrer on sessions.referrer_id = urlsReferrer.id

答案 2 :(得分:1)

您应该对url使用两次连接,其中url_id之一,referrer_id之一。

    select session_id
      , visiting_time
      , u1.url
      , u2.url
      , country
    from sessions
    INNER JOIN  visitors ON sessions.session_id = visitors.session_id
    INNER JOIN urls u1 on u1.id= sessions.url_id
    INNER JOIN urls u2 on u2.id= sessions.referrer_id

通过这种方式,您可以加入会话以同时获取所需的值

答案 3 :(得分:1)

联接是在from语句中定义的-请仔细阅读https://www.w3schools.com/sql/default.asp,以更好地了解联接的用法。

根据实际来自哪个表“ referrer_url”的表来修改查询

警告::您必须包含限制您的结果的where语句。我强烈建议定义一个日期字段和范围,以防止您启动长时间运行的查询并影响数据库性能。

有关查询,请参见下文

select 
s.session_id, 
v.visiting_time, 
s.country,
u.url,
u.referrer_url


from 
sessions s
join visitors v on session_id
join urls on u.id=s.url_id

;