Использование DISTINCT в SQL-запросах для исключения повторяющихся данных применительно к фреймворку CodeIgniter.
Как использовать DISTINCT в запросах MySQL, чтобы выбирать неповторяющиеся данные. Чтобы не выдумывать пример, приведу реальный случай. Библиотека Ion Auth для аутентификации пользователей для CodeIgniter. Автор этой библиотеки, Ben Edmunds, использует таблицу users (данные пользователя) и users_groups (соответствие пользователей группе или группам). Ещё есть таблица groups для самих групп. У себя, на loco.ru, в проектах с личным кабинетом мы используем Ion Auth. Я долго не мог понять почему в новой версии Ion Auth 2.x в случае, когда один пользователь относится к нескольким группам, то есть имеется несколько записей в таблице users_groups для одного пользователя, то при выводе списка пользователей нескольких групп этот пользователь выводится несколько раз (столько сколько он упоминается в users_groups).
Использовался такой код в контроллере (подчёркиваю функцию, которая виновата была в ошибке):
$groups = array(1,2,3,4);
$this->data['list_staff'] = $this->ion_auth->users($groups)->result(); // выбираем всех admins,teachers,students,users из зарегистрированных пользователей
foreach ($this->data['list_staff'] as $k => $one_staff)
{
$this->data['list_staff'][$k]->groups = $this->ion_auth->get_users_groups($one_staff->id)->result();
}
Потом в виде выводил
<?php foreach($list_staff as $one):?>
...<b><?php echo $one->first_name;?> <?php echo $one->last_name;?></b><br />
<span class="small1"><i>
<?php foreach ($one->groups as $group):?>
<?php echo $group->description;?>,
<?php endforeach?>
...
</div>
<div class="clear"> </div>
</div>
<?endforeach;?>
После этого и наблюдаю список с повторами одних и тех же пользователей.
Ben Edmunds добавил одну строку в библиотеку и всё встало на свои места и наступило маленькое счастье)). Спасибо Ben!
public function users($groups = NULL)
{
$this->trigger_events('users');
//default selects
$this->db->select(array(
$this->tables['users'].'.*',
$this->tables['users'].'.id as id',
$this->tables['users'].'.id as user_id'
));
...
//join and then run a where_in against the group ids
if (isset($groups) && !empty($groups))
{
$this->db->distinct();
$this->db->join(
$this->tables['users_groups'],
$this->tables['users_groups'].'.user_id = ' . $this->tables['users'].'.id',
'inner'
);
...
SELECT DISTINCT `users`.id, CONCAT(`users`.first_name, ' ', `users`.last_name) FROM (`users`) INNER JOIN `users_groups` ON `users_groups`.`user_id` = `users`.`id` WHERE `users_groups`.`group_id` IN (1, 2, 3, 4)"
Слово DISTINCT убирает повторы в выборке из users_groups!
SELECT DISTINCT - совсем не "основной инстинкт".
almix
Разработчик Loco, автор статей по веб-разработке на Yii, CodeIgniter, MODx и прочих инструментах. Создатель Team Sense.
Вы можете почитать все статьи от almix'а.
- 0 MySQL и PHP: Вычисление возраста (количество лет) по дате рождения (20.06.2017)
- 0 MySQL: проверить содержится ли значение в поле столбца (в столбце хранится строка значений через запятую) (22.05.2014)
- 0 CodeIgniter: Всплывающая форма обратной связи на Ajax в Bootstrap Modal и проверкой Captcha (18.02.2014)
- 0 MySQL: выбираем данные за период времени (за текущий месяц, за эту неделю..) (30.10.2013)
- 0 Php функция implode внутри запроса SELECT к MySQL. (02.09.2013)
- 0 Устанавливаем и настраиваем WampServer (аналог MAMP в Mac и возможная замена Denwer'у) на Windows (22.03.2013)
- 0 Полезные команды для вебразработчика (20.11.2017)
- MySQL: Как выбрать из таблицы строки, удовлетворяющие одновременно двум значениям колонки? (06.04.2017)
- MySQL ошибка: Unknown column 'table_name.id' in 'on clause' (06.04.2017)
- MySQL запрос приджойнивания с INNER JOIN 2-х таблиц к основной (18.11.2016)
- Как правильно обновить ExpressionEngine до последней версии 2.5.5 (05.02.2013)
- Team Sense: Доступна отправка сообщения/письма на email сотрудника. (18.01.2013)
- TeamSense: username (логин) в регистрации пользователя. Внедрили библиотеку DHTMLX в TeamSense. (11.01.2013)
- Team Sense: В календарь добавлена возможность указывать место проведения уроков (в офисе, на выезде) (12.12.2012)
- Team Sense: Многопользовательский календарь, заменяем радиокнопки на чекбоксы в выборе преподавателей. Массивы в Javascript. (06.12.2012)
- Как корректно вставить в MySQL текст с кавычками, используя PHP? (06.12.2012)
- Team Sense: В календарь-расписание уроков добавлено разделение по преподавателям, которым присвоены свои цвета. (04.12.2012)
- CodeIgniter не передаёт $this->uri->segment(3) в функцию контроллера (передача переменной PHP->JavaScript->PHP) (28.11.2012)
- Воюем с форматом даты в JavaScript. Приведение формата даты в поле input в календаре системы TeamSense к более красивому виду. (18.11.2012)
- Team Sense: Теперь Email-оповещения в TODO можно отправлять как для руководителя задачи, так и для помощников. (21.09.2012)
- CodeIgniter и TeamSense: Делаем свой вид для страницы с ошибкой 404, настраиваем правильную отдачу статусов в HTTP headers (12.09.2012)
- Команды для сron job (для планировщика Cron на хостинге) (29.08.2012)
- Установка другого сайта (на CodeIgniter или Yii) в подпапку и чтобы поддомен ссылался на подпапку (25.08.2015)
- CodeIgniter: Подключение JS и CSS файлов там, где это нужно. (26.06.2012)
- Использование DISTINCT в SQL-запросах для исключения повторяющихся данных применительно к фреймворку CodeIgniter. (18.06.2012) ← вы тут