SQL Join 在两个表上的 Codeigniter 中?

Posted

技术标签:

【中文标题】SQL Join 在两个表上的 Codeigniter 中?【英文标题】:SQL Join in Codeigniter on two tables? 【发布时间】:2012-12-16 03:06:43 【问题描述】:

我正在构建一个 url 缩短/重定向服务,我有点困惑如何最好地从两个表中获取数据。

我有两张这样的表:

重定向

id
datetime
ip_address
browser_agent
url_string

链接

id
alias
url
created
user_id

Links 存储链接详细信息,每次有重定向时,它都会在 redirects 表中记录为每个重定向一行。

链接中的

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

我想要实现的是从 redirects 表中选择(并计算)所有重定向,其中 url_stringalias 相同,然后其中user_id 与登录用户相同。

我正在使用 Codeigniter。

到目前为止,我正在尝试这样的事情:

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

但我没有运气。

【问题讨论】:

【参考方案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;

并在 view 中使用 foreach 语法根据您的要求显示 db-contents。

【讨论】:

【参考方案2】:

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;

【讨论】:

好吧,他们完美结合。但是我将如何处理链接表。我的意思是每个链接只加载一行而不是每个重定向加载一行? @Chris 你能解释一下从这两个表中选择什么吗?对于您在问题中发布的示例,example.com/Dw4 应该如何从两个表中选择,exampl.com 来自哪个字段?谢谢。 好的,我想做的是列出用户创建的所有链接,所以从 user = $uid 的链接中选择 *。然后在该表中,我还希望能够根据重定向表中的数据提供该链接获得多少重定向的计数。谢谢 好吧,这太棒了。最后一件事。我不能再从重定向表中访问诸如 browser_agent 之类的东西。我需要做什么才能使用它?感谢您的所有帮助。 @Chris 有几种方法可以做到这一点,一种方法是在我更新的答案中添加一个额外的JOIN。请参阅我的编辑。如果您需要任何其他东西或出现任何问题,请随时询问。【参考方案3】:

正如您所说,登录用户的 user_id 应该相同,您应该使用 join with 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

【讨论】:

以上是关于SQL Join 在两个表上的 Codeigniter 中?的主要内容,如果未能解决你的问题,请参考以下文章

重复的 SQL 导致 JOIN - Codeigniter

两个不同表上的 ORACLE SQL 触发器或存储过程

优化 30 000+ 行表上的 LEFT JOIN

INNODB FULLTEXT 使用 JOIN 搜索:不同表上的搜索词

BigQuery JOIN 在两个表上

多个表上的多个 FULL OUTER JOIN