2014-11-02 4 views
1

Я пытаюсь достичь следующего: У меня есть две таблицы. Одна из таблиц называется characters, а другая - experience. Прямо сейчас я хочу распечатать список всех characters и связать последнюю строку в experience. К этим строкам добавляются строки characters без строки в experience.Выберите последнюю строку в LEFT JOIN PHP MySQL CodeIgniter

Здесь приведен пример таблиц и желаемого вывода.

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   | 

До сих пор я сделал этот запрос, и это, кажется, работает в MySQL

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; 

Тогда, я хочу, чтобы реализовать это в CodeIgniter, но вот где она идет не так. Следующее, что у меня есть сейчас, оно заполняет c.name, но e1.exp остается пустым.

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

Связано ли это с моим MySQL-запросом? Является ли моя реализация в CodeIgniter некорректной? И то и другое? Я ценю каждый совет!

+0

Попробуйте проверить, что SQL CI запроса генерируется (с помощью '$ this-> db-> last_query() ', я думаю). Тогда давайте посмотрим, есть ли разница. –

+0

Созданный запрос правильный, ** ITS A TYPO ** '$ this-> db-> select ('c.name, e1.exp');' должен быть '$ this-> db-> select ('c. имя, e1.experience '); 'потому что ** Нет такого столбца, называемого exp, его опыт ** –

ответ

4

Вы можете использовать условие соединения, которое выбирает только строку максимум 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') 
+0

Это работает как шарм! Большое спасибо. – Roel

1

Roel вы можете использовать метод, чтобы найти сумму результатов. В 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(); 

Надеется, что это помогает