Codeigniter 使用 where 子句连接多个表
Codeigniter join multiple tables with where clauses
我有四个 table 需要连接在一起,其中一个 table 有两个不同的记录我需要抓取。 guild
和 party
tables 我正在获取它们的名称,以便我可以向用户显示名称而不是 ID,charlog
table 有 char_id 的创建日期和上次登录日期,我也想显示。这是 tables:
char
table:
----------------------------------------------------
| char_id | name | guild_id | party_id |
|---------------------------------------------------
| 150000 | char1 | 3 | 3 |
| 150001 | char2 | 2 | (NULL) |
| 150002 | char3 | (NULL) | 1 |
| 150003 | char4 | 1 | 2 |
----------------------------------------------------
guild
table:
-------------------------
| guild_id | name |
-------------------------
| 1 | guild_1 |
| 2 | guild_2 |
| 3 | guild_3 |
-------------------------
party
table:
-------------------------
| party_id | name |
-------------------------
| 1 | party_1 |
| 2 | party_2 |
| 3 | party_3 |
-------------------------
charlog
table:
----------------------------------------------------
| time | char_id | char_msg |
----------------------------------------------------
| 2015-02-14 06:45:32 | 150000 | make new char |
| 2015-02-14 06:45:58 | 150000 | char select |
| 2015-02-15 12:32:19 | 150001 | make new char |
| 2015-02-15 16:54:01 | 150000 | char select |
| 2015-02-15 19:23:54 | 150001 | char select |
| 2015-02-16 01:32:13 | 150002 | make new char |
| 2015-02-16 01:33:01 | 150003 | make new char |
| 2015-02-16 04:45:43 | 150000 | char select |
| 2015-02-16 07:43:22 | 150003 | char select |
----------------------------------------------------
如前所述,我需要从 charlog
table 中获取 make new char
条目以显示角色的创建时间以及最后(按日期)char select
播放角色时显示的条目,所有这些都包含一个 char_id.
总而言之,我会寻找这样的 table:
---------------------------------------------------------------------------------------------------------------------
| char_id | name | guild_id | guild_name | party_id | party_name | create_time | lastlogin_time |
---------------------------------------------------------------------------------------------------------------------
| 150000 | char1 | 3 | guild_3 | 3 | party_3 | 2015-02-14 06:45:32 | 2015-02-16 04:45:43 |
我在 Codeigniter 中使用以下活动记录行来尝试获取我需要的数据。它 returns create_date 正确但 lastlogin_time 没有返回(它是空白的):
function get_char_info($cid) {
$this->db->select('char.*,guild.guild_id,guild.name AS guild_name,party.party_id,party.name AS party_name,charlog1.time AS create_time,charlog2.time AS lastlogin_time');
$this->db->from('char');
$this->db->where('char.char_id', $cid);
$this->db->join('guild', 'char.guild_id = guild.guild_id', 'left');
$this->db->join('party', 'char.party_id = party.party_id', 'left');
$this->db->join('charlog AS charlog1', 'char.char_id = charlog1.char_id AND charlog1.char_msg = "make new char"', 'left');
$this->db->join('charlog AS charlog2', 'char.char_id = charlog2.char_id AND charlog2.char_msg = (SELECT max(charlog.time) FROM charlog WHERE char_msg = "char select")', 'left');
$query = $this->db->get();
return $query->row();
}
如前所述,guild_name、party_name 和 create_time 正确通过,但 lastlogin_time 为空白,没有错误。
我试过在活动记录子句中混淆一些东西,但无法显示 lastlogin_time。任何帮助,将不胜感激。
您的子查询中的连接不正确:
应该是charlog2.time = (SELECT....)
不是charlog2.char_msg = (SELECT....)
我有四个 table 需要连接在一起,其中一个 table 有两个不同的记录我需要抓取。 guild
和 party
tables 我正在获取它们的名称,以便我可以向用户显示名称而不是 ID,charlog
table 有 char_id 的创建日期和上次登录日期,我也想显示。这是 tables:
char
table:
----------------------------------------------------
| char_id | name | guild_id | party_id |
|---------------------------------------------------
| 150000 | char1 | 3 | 3 |
| 150001 | char2 | 2 | (NULL) |
| 150002 | char3 | (NULL) | 1 |
| 150003 | char4 | 1 | 2 |
----------------------------------------------------
guild
table:
-------------------------
| guild_id | name |
-------------------------
| 1 | guild_1 |
| 2 | guild_2 |
| 3 | guild_3 |
-------------------------
party
table:
-------------------------
| party_id | name |
-------------------------
| 1 | party_1 |
| 2 | party_2 |
| 3 | party_3 |
-------------------------
charlog
table:
----------------------------------------------------
| time | char_id | char_msg |
----------------------------------------------------
| 2015-02-14 06:45:32 | 150000 | make new char |
| 2015-02-14 06:45:58 | 150000 | char select |
| 2015-02-15 12:32:19 | 150001 | make new char |
| 2015-02-15 16:54:01 | 150000 | char select |
| 2015-02-15 19:23:54 | 150001 | char select |
| 2015-02-16 01:32:13 | 150002 | make new char |
| 2015-02-16 01:33:01 | 150003 | make new char |
| 2015-02-16 04:45:43 | 150000 | char select |
| 2015-02-16 07:43:22 | 150003 | char select |
----------------------------------------------------
如前所述,我需要从 charlog
table 中获取 make new char
条目以显示角色的创建时间以及最后(按日期)char select
播放角色时显示的条目,所有这些都包含一个 char_id.
总而言之,我会寻找这样的 table:
---------------------------------------------------------------------------------------------------------------------
| char_id | name | guild_id | guild_name | party_id | party_name | create_time | lastlogin_time |
---------------------------------------------------------------------------------------------------------------------
| 150000 | char1 | 3 | guild_3 | 3 | party_3 | 2015-02-14 06:45:32 | 2015-02-16 04:45:43 |
我在 Codeigniter 中使用以下活动记录行来尝试获取我需要的数据。它 returns create_date 正确但 lastlogin_time 没有返回(它是空白的):
function get_char_info($cid) {
$this->db->select('char.*,guild.guild_id,guild.name AS guild_name,party.party_id,party.name AS party_name,charlog1.time AS create_time,charlog2.time AS lastlogin_time');
$this->db->from('char');
$this->db->where('char.char_id', $cid);
$this->db->join('guild', 'char.guild_id = guild.guild_id', 'left');
$this->db->join('party', 'char.party_id = party.party_id', 'left');
$this->db->join('charlog AS charlog1', 'char.char_id = charlog1.char_id AND charlog1.char_msg = "make new char"', 'left');
$this->db->join('charlog AS charlog2', 'char.char_id = charlog2.char_id AND charlog2.char_msg = (SELECT max(charlog.time) FROM charlog WHERE char_msg = "char select")', 'left');
$query = $this->db->get();
return $query->row();
}
如前所述,guild_name、party_name 和 create_time 正确通过,但 lastlogin_time 为空白,没有错误。
我试过在活动记录子句中混淆一些东西,但无法显示 lastlogin_time。任何帮助,将不胜感激。
您的子查询中的连接不正确:
应该是charlog2.time = (SELECT....)
不是charlog2.char_msg = (SELECT....)