在LEFT JOIN PHP MySQL CodeIgniter中选择最新一行

时间:2014-11-02 00:52:23

标签: php mysql codeigniter

我正在努力实现以下目标: 我有两张桌子。其中一个表称为characters,另一个称为experience。现在我想要打印所有characters的列表,并将experience中的最新行链接到它。 <{1}}中添加characters中没有行的行仍应显示。

这是表和所需输出的示例。

experience

到目前为止,我做了这个查询,它似乎在MySQL中运行

characters
id   |   name   |
----------------|
1    | TestChar |
2    | NewChar  |
3    | OldChar  |

experience
id |  char_id  |  experience  |
------------------------------|
1  |  1        | 683185858    |
2  |  2        | 85712849     |
3  |  1        | 687293919    |
4  |  1        | 794812393    |

output
name      |   experience   |
---------------------------|
TestChar  | 794812393      |
NewChar   | 85712849       |
OldChar   | NULL           |

然后,我想在CodeIgniter中实现它,但这就是它出错的地方。 以下是我现在所拥有的内容,它填写了c.name但是e1.exp仍为空。

SELECT c.name, e1.experience
FROM characters c
LEFT JOIN experience e1 ON e1.char_id = c.id 
LEFT JOIN experience e2 ON e1.char_id = e2.char_id AND e2.id > e1.id
WHERE e2.id IS NULL;

这与我的MySQL查询有关吗?我在CodeIgniter中的实现是不正确的?都? 我很感激你的建议!

2 个答案:

答案 0 :(得分:6)

您可以使用仅选择每id最多char_id行的连接条件。

$this->db->select('c.name, e1.exp');
$this->db->from('characters as c');
$this->db->join('experience as e1', 'e1.id = (select max(id) from experience as e2 where e2.char_id = e1.char_id)', 'left');

或类似地使用派生表

$this->db->select('c.name, e1.exp');
$this->db->from('characters as c');
$this->db->join('(select max(id) max_id, char_id 
    from experience group by char_id) as t1', 't1.char_id = c.id', 'left')
$this->db->join('experience as e1', 'e1.id = t1.max_id', 'left')

答案 1 :(得分:1)

Roel你可以使用sum方法来查找结果。在mysql中它将是

SELECT c.name, SUM(e1.experience) as expsum
FROM characters c
LEFT JOIN experience e1 ON e1.char_id = c.id GROUP BY c.name

当您在codeigniter中使用时,您可以尝试以下操作: -

$this->db->select("c.name, SUM(e1.exp) as 'expsum'");
$this->db->from('characters as c');
$this->db->join('experience as e1', 'e1.char_id = c.id', 'left');
$this->db->group_by("c.name"); 
$this->db->get();
$query->results_array();

希望有所帮助