Использование DISTINCT в SQL-запросах для исключения повторяющихся данных применительно к фреймворку CodeIgniter.
Чтобы не выдумывать пример, приведу реальный случай. Библиотека 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) ← вы тут