如何在 Codeigniter 中两次加入同一个表并分配表别名?

     2023-02-24     265

关键词:

【中文标题】如何在 Codeigniter 中两次加入同一个表并分配表别名?【英文标题】:How to join the same table twice and assign table aliases in Codeigniter? 【发布时间】:2012-02-27 19:49:57 【问题描述】:

我正在尝试使用 PyroCms 在 Codeigniter 中创建一个邮件系统。 在我的邮件表中,我有一个“收件人”行和一个“发件人”行,其中包含发件人和收件人的用户 ID。为了从 id 中检索用户名,我试图将表连接在一起,但它只是返回了这个错误:

错误号:1066

不是唯一的表/别名:'default_users'

SELECT `default_mailsystem`.*, `default_users`.`username` AS modtager, `default_users`.`username` as afsender
FROM (`default_mailsystem`)
LEFT JOIN `default_users` ON `default_mailsystem`.`recipent` = `default_modtager`.`id`
LEFT JOIN `default_users` ON `default_mailsystem`.`sender` = `default_afsender`.`id`
ORDER BY `id` DESC

文件名:/hsphere/local/home/brightmedia/reuseable.dk/modules/mail/models/mail_m.php

行号:13

我的代码如下:

$this->db->select('mailsystem.*, users.username AS modtager, users.username as afsender')
    ->join('users', 'mailsystem.recipent = modtager.id', 'left')
    ->join('users', 'mailsystem.sender = afsender.id', 'left');
$this->db->order_by('id', 'DESC');
return $this->db->get('mailsystem')->result();

有趣的是,如果我删除最后一个“加入”操作并让它只加入邮件的收件人,一切都会很好。

【问题讨论】:

@mickmackusa 应要求,现已续订。 【参考方案1】:

这很简单

$this->db->select('mailsystem.*, users.username AS modtager, users.username as afsender')
$this->db->join('users', 'mailsystem.recipent = modtager.id AND mailsystem.sender = afsender.id', 'left')
$this->db->order_by('id', 'DESC');
return $this->db->get('mailsystem')->result();

【讨论】:

这个纯代码回答会改变查询逻辑。这个答案会误导想要将同一个表两次加入第一个表的研究人员。【参考方案2】:

您是否尝试过在连接函数中强制使用别名(“AS”运算符在您拥有的 select 子句中不起作用......)?

<?php
$this->db->select('mailsystem.*, modtager.username AS modtager_name, afsender.username as afsender_name')
    ->join('`users` `modtager`', 'mailsystem.recipent = modtager.id', 'left')
    ->join('`users` `afsender`', 'mailsystem.sender = afsender.id', 'left');

$this->db->order_by('mailsystem.id', 'DESC');

return $this->db->get('mailsystem')->result();

【讨论】:

手动添加反引号违反了 ActiveRecord 方法为您提供标识符转义的功能(在移动到不同的数据库时仍然会保留)。换句话说,使用查询构建器方法的想法是让您不需要手动引用查询的部分内容。【参考方案3】:

像这样使用别名 -

$this->db->select('mailsystem.*, users_table_a.username AS modtager, users_table_b.username as afsender')
$this->db->join('users users_table_a', 'mailsystem.recipent = users_table_a.id', 'left');
$this->db->join('users users_table_b', 'mailsystem.sender = users_table_b.id', 'left');
$this->db->order_by('id', 'DESC');
return $this->db->get('mailsystem')->result();

【讨论】:

这个答案缺少解释。这个“代码块”的答案将要求研究人员使用您的代码滚动并仔细检查 OP 的代码。【参考方案4】:

你可以用这个:

$this->db->select('mailsystem.*, users.username AS modtager, users.username as afsender')
$this->db->join('users', 'mailsystem.recipent = modtager.id AND mailsystem.sender = afsender.id', 'left')
$this->db->order_by('id', 'DESC');
return $this->db->get('mailsystem')->result();

*如果您使用任何 db 前缀,请使用此 *

$this->db->select('mailsystem.*, users.username AS modtager, users.username as afsender')
$this->db->join('users', 'mailsystem.recipent = modtager.id AND '.$this->db->dbprefix('mailsystem').'.sender = '.$this->db->dbprefix('afsender').'.id', 'left')
$this->db->order_by('id', 'DESC');
return $this->db->get('mailsystem')->result();

【讨论】:

这个“使用这个”(没有解释)答案不是将同一个表加入父表两次——它是将一个表加入父表一次。【参考方案5】:
Its very easy to get data from single table
$this->db->select('a.*,b.fname AS cname,c.fname as uname'); 
$this->db->from('tbl_menus a'); 
$this->db->join('tbl_admin_login b', 'b.id = a.create_by', 'left'); 
$this->db->join('tbl_admin_login c', 'c.id = a.update_by', 'left'); 
$this->db->order_by('a.id', 'desc'); 
return $this->db->get()->result_array();

【讨论】:

虽然此代码可以解决问题,including an explanation 说明如何以及为什么解决问题将真正有助于提高您的帖子质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提问的人。请edit您的回答添加解释并说明适用的限制和假设。 这个答案并没有试图让 OP 的数据/值有尊严。看起来这个纯代码答案更像是在回答需要相同技术的不同问题。【参考方案6】:

在这个线程的时候,我认为 codeigniter 调用错过了在连接中执行 AS 的可能性,因此这解决了这个问题:

$sql = "
    SELECT default_mailsystem.*,
           recipent.first_name AS modtager, 
           sender.first_name AS afsender
    FROM default_mailsystem
    LEFT JOIN default_profiles AS recipent ON recipent.id = default_mailsystem.id
    LEFT JOIN default_profiles AS sender ON sender.id = default_mailsystem.id
";
return $this->db->query($sql)->result();

【讨论】:

这个答案不喜欢 CI 的查询构建方法。

在一个查询中两次从同一个表中提取时出现问题

】在一个查询中两次从同一个表中提取时出现问题【英文标题】:Troublepullingfromthesametabletwiceinonequery【发布时间】:2021-03-0517:05:56【问题描述】:对不起,如果这个标题措辞奇怪。我正在处理一个查询,该查询会提取在某个地方... 查看详情

如何在一个 submitHandler 中两次更新反应状态

】如何在一个submitHandler中两次更新反应状态【英文标题】:HowtoupdatereactstatetwiceinonesubmitHandler【发布时间】:2018-10-2218:00:45【问题描述】:我想在React中提交一个表单,我试图用一个submitHandler更新状态两次。第二次更新依赖于第... 查看详情

SQL 查询优化:在事实表中两次使用相同指标的最佳方法是啥?

】SQL查询优化:在事实表中两次使用相同指标的最佳方法是啥?【英文标题】:SQLQueryOptimization:whatisthebestapproachtousesamemetrictwiceinthefacttable?SQL查询优化:在事实表中两次使用相同指标的最佳方法是什么?【发布时间】:2020-02-2618:... 查看详情

如何在同一列或不同列的一个sql语句中两次使用'BETWEEN'条件

】如何在同一列或不同列的一个sql语句中两次使用\\\'BETWEEN\\\'条件【英文标题】:howtouse\'BETWEEN\'condetiontwotimesinonesqlstatementforsamecolumnordiffrentcolumns如何在同一列或不同列的一个sql语句中两次使用\'BETWEEN\'条件【发布时间】:2011-05-... 查看详情

如何加入一个表两次

】如何加入一个表两次【英文标题】:Howtojoinatabletwice【发布时间】:2019-01-2010:26:01【问题描述】:我有以下两张表,我想加入他们做第三张表表Acustomer_idfirst_order_datelast_order_date1232017-04-062018-07-304562017-08-072018-07-247892018-03-132018-07... 查看详情

在同一个查询中两次使用 UNPIVOT

】在同一个查询中两次使用UNPIVOT【英文标题】:UsingUNPIVOTtwiceinthesamequery【发布时间】:2022-01-1816:49:42【问题描述】:您好,我遇到了以下问题:我有一个大约1600行的表,其结构如下:StoreID|Target1|Target2|Target3|Date1|Date2|Date3101|X|Y|... 查看详情

React:如何在页面中两次渲染组件?

】React:如何在页面中两次渲染组件?【英文标题】:React:Howtorenderacomponenttwiceinapage?【发布时间】:2018-01-2605:38:50【问题描述】:我在ReactmyComponent.js中有一个组件构建ReactDOM.render(<MyComponent/>,document.getElementById(\'my-id\'));在我... 查看详情

如何在 C# 中两次读取 Http 响应流?

】如何在C#中两次读取Http响应流?【英文标题】:HowcanIreadanHttpresponsestreamtwiceinC#?【发布时间】:2010-09-1323:01:47【问题描述】:我正在尝试通过以下方式读取Http响应流两次:HttpWebResponseresponse=(HttpWebResponse)request.GetResponse();stream=re... 查看详情

停止 SQL 在 JOIN 中两次返回相同的结果

...取我想要的数据,但由于我是SQL新手,所以我无法弄清楚如何停止多次返回数据。她的SQL语句;SELECTT.url,T.ID,S.status,S.ID,E.action,E.ID,E.timestampFRO 查看详情

加入表两次 - 在同一个表的两个不同列上

】加入表两次-在同一个表的两个不同列上【英文标题】:Jointabletwice-ontwodifferentcolumnsofthesametable【发布时间】:2012-05-2910:19:50【问题描述】:我有一个非常混乱的数据库,其中一个表在单独的表中保存了我需要的两个值。这是我... 查看详情

如何在 Django 中两次在查询中使用过滤器

】如何在Django中两次在查询中使用过滤器【英文标题】:howtousefilterinquerytwiceindjango【发布时间】:2022-01-1113:42:38【问题描述】:我正在尝试使用此查询过滤一些数据,get_members=PaymentDetails.objects.filter(participants_name=Participants.objects... 查看详情

不能在一个槽中两次更改 QLabel 文本

】不能在一个槽中两次更改QLabel文本【英文标题】:Can\'tchangeQLabeltexttwiceinaslot【发布时间】:2015-01-1106:42:01【问题描述】:我在以下函数中连续两次更新QLabel文本时遇到问题:voidMainWindow::on_button_clicked()ui->label->setText("Trainin... 查看详情

如何防止在node.js中两次调用相同URL的获取

】如何防止在node.js中两次调用相同URL的获取【英文标题】:HowtopreventfetchwithsameURLbeingcalledtwiceinnode.js【发布时间】:2018-05-0110:48:10【问题描述】:我要对后端进行x次调用。其中一些指向相同的URL。我正在缓存结果。但我的问题... 查看详情

如何在 Codeigniter 中连接两个表

】如何在Codeigniter中连接两个表【英文标题】:HowtojointwotablesinCodeigniter【发布时间】:2010-12-2014:16:29【问题描述】:我尝试加入2个表并输出结果:在模型中:$this->db->select(\'*\');$this->db->from(\'news\');$this->db->join(\'autho... 查看详情

如何计算 Git 中两次提交之间更改的行数?

】如何计算Git中两次提交之间更改的行数?【英文标题】:HowcanIcalculatethenumberoflineschangedbetweentwocommitsinGit?【发布时间】:2011-02-0110:56:14【问题描述】:有没有简单的方法来计算Git中两次提交之间更改的行数?我知道我可以做一... 查看详情

防止在java中两次显示Arraylist值

】防止在java中两次显示Arraylist值【英文标题】:PreventdisplayofArraylistvaluestwiceinjava【发布时间】:2015-04-1615:17:06【问题描述】:我有一个返回数组列表的方法。但是Arraylsit两次显示其值。代码是-ArrayList<Double>ref_jsp=newArrayList<... 查看详情

使用 strtok 解析字符串 - 在 C++ 中两次

】使用strtok解析字符串-在C++中两次【英文标题】:parsingastringusingstrtok-twiceinC++【发布时间】:2019-11-1210:41:43【问题描述】:我想使用strtok解析给定的字符串-但使用它两次。要解析的字符串:“x=2;y=30”。期望的输出:一个包含[x... 查看详情

mysql加入2个表 - 但必须加入同一个表两次

】mysql加入2个表-但必须加入同一个表两次【英文标题】:mysqljoin2tables-buthavetojoinsametabletwice【发布时间】:2017-06-1721:46:01【问题描述】:我正在为我的联盟制定垒球赛程。我有一个TEAMS表和一个GAMES表。TEAMS是id和team_name。GAMES表... 查看详情