2013-01-01 75 views
4

我正在构建一个URL缩短/重定向服务,我对如何最好地从两个表中获取数据感到有点困惑。SQL在两张桌子上加入Codeigniter?

我有像这样的两个表:

重定向

id 
datetime 
ip_address 
browser_agent 
url_string 

链接

id 
alias 
url 
created 
user_id 

链接将链路的细节和不断y的时间有一个重定向它记录在重定向表作为每个重定向的单行。

alias链接url_string重定向是相同的。例如Dw4所以域名将是example.com/Dw4 - 重定向到url字段链接

我试图做到的,是选择(和计数)全部由重定向重定向表,其中url_string是一样alias,然后在那里user_id是一样的登录用户。

我正在使用Codeigniter。

到目前为止,我试图去这样的事情:

$query=$this->db->query("SELECT * " . "FROM links, redirects " . "WHERE links.alias = redirects.url_string"); 

,但我有没有运气。

回答

1

JOIN两个表所示:

SELECT 
    r.* 
FROM redirects r 
INNER JOIN links l ON r.url_string = l.alias; 

更新:试试这个:

SELECT 
    l.*, 
    r.browser_agent, 
    rCounts.redirectsCount 
FROM links l 
INNER JOIN redirects r ON r.url_string = l.alias 
INNER JOIN 
(
    SELECT url_string, COUNT(*) redirectsCount 
    FROM redirects 
    GROUP BY url_string 
) rCounts ON rrCounts.url_string = l.alias; 
+0

确定这加入他们完美。但是,我将如何处理链接表。我的意思是每个链接加载一行而不是每个重定向一个? –

+0

@Chris你能解释一下从这两张表格中究竟选择什么吗?对于你在你的问题中发布的例子,example.com/Dw4应该如何从这两个表中选择,exampl.com是来自哪个字段?谢谢。 –

+0

好吧,我试图做的是列出用户创建的所有链接,所以选择*从用户= $ uid链接。然后在该表中,我还希望能够根据重定向表中的数据提供链接的重定向数量。谢谢 –

1

您可以使用join此为:

$this->db->select('*'); 
    $this->db->from('links'); 
    $this->db->join('redirects', 'redirects.url_string = links.alias'); 
    $query = $this->db->get(); 

    return $query->result; 

查看使用foreach语法将数据库内容显示为您的要求。

0

正如你说,USER_ID应该是相同的登录用户,你应该使用 user_ID的加入也让特定USER_ID细节,让您的查询应该是这样的:

SELECT redirects.id,count(*) FROM redirects inner join links 
on redirects.url_string=links.alias 
and redirects.id=links.user_id 
group by redirects.id