У меня есть таблица с несколькими строками, имеющими общее значение поля «owner_id», и я хотел бы получить для каждой из них все совпадающие строки, кроме первой. Таким образом, запрос должен возвращать строки с идентификатором 2,3,5,6 в приведенном ниже примере таблицы.
-----------------------
| ID | VALUE | USER_ID |
-----------------------
| 1 | 11111 | 1 |
------------------------
| 2 | 22222 | 1 |
------------------------
| 3 | 33333 | 1 |
------------------------
| 4 | 11111 | 2 |
------------------------
| 5 | 22222 | 2 |
------------------------
| 6 | 33333 | 2 |
------------------------
Вот код, который у меня был до того, как мне было предложено решение:
public function get_follow_ups()
{
$this->db->select('a.id, a.created_at, a.user_id, month(b.created_at) AS user_month');
$this->db->from('entries a, users b');
$this->db->order_by('a.created_at');
$this->db->where('a.user_id = b.id');
$this->db->where('day(a.created_at) != day(b.created_at)');
$this->db->where('a.owner_id', $this->_owner_id);
return $this->db->get();
}
Иногда пользователь не вносил запись в тот же день, когда зарегистрировался, в результате чего первая запись включалась в запрос при использовании этой функции.
Имея идею создать подзапрос, я изменил функцию следующим образом:
public function get_follow_ups()
{
$this->db->select('MIN(created_at)')->from('entries')->group_by('user_id');
$subQuery = $this->db->get_compiled_select();
$this->db->select('a.id, a.created_at, a.user_id, month(b.created_at) AS user_month');
$this->db->from('entries a, users b');
$this->db->order_by('a.created_at');
$this->db->where('a.user_id = b.id');
$this->db->where("a.created_at NOT IN ($subQuery)", NULL, FALSE);
$this->db->where('a.owner_id', $this->_owner_id);
return $this->db->get();
}
Подробнее здесь: https://stackoverflow.com/questions/464 ... eld-values