关键词:
【中文标题】如何在 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表... 查看详情