Вывод данных из двух таблиц

267
12 марта 2017, 07:57

Просьба помочь в решении следующего вопроса.

Есть две таблицы:

Таблица users:

id, user, pass
1, user1, pass1
2, user2, pass2
3, user3, pass3

Таблица log:

id, id_users, date_time, ip
1, 1, 2017-03-11 22:22:22, 192.168.1.1
2, 1, 2017-03-11 22:32:22, 192.168.1.1
3, 1, 2017-03-11 22:42:22, 192.168.1.5
4, 2, 2017-03-11 23:00:22, 192.168.1.10
5, 2, 2017-03-11 23:05:22, 192.168.1.10
6, 3, 2017-03-11 23:55:22, 192.168.1.22

Как вывести данные из двух таблиц я знаю. Мне нужно, чтобы по каждому юзеру была статистика его заходов и не было дублей в зависимости от кол-ва записей в таблице log, т.е. к каждому юзеру в отдельной таблице все ip.

Сейчас происходит так:

user1, 2017-03-11 22:22:22, 192.168.1.1
user1, 2017-03-11 22:32:22, 192.168.1.1
user1, 2017-03-11 22:42:22, 192.168.1.5
user2, 2017-03-11 23:00:22, 192.168.1.10
user2, 2017-03-11 23:05:22, 192.168.1.10

и т.д.

GROUP BY не предлагать, т.к. все будет сгруппировано и в результате я увижу только один ip.

Мне бы хотелось, чтобы вывод был таким образом:

user1, 2017-03-11 22:22:22, 192.168.1.1
       2017-03-11 22:32:22, 192.168.1.1
       2017-03-11 22:42:22, 192.168.1.5

user2, 2017-03-11 22:22:22, 192.168.1.1
       2017-03-11 23:00:22, 192.168.1.10
       2017-03-11 23:05:22, 192.168.1.10

Очень прошу помочь. Заранее спасибо

Answer 1

Функция GROUP_CONCAT:

SELECT u.user, GROUP_CONCAT(CONCAT(l.date_time, ' - ', l.ip))
FROM users u
JOIN log l ON l.id_users = u.id
GROUP BY u.id

Запрос вернёт весь лог для юзера в одной строке, позже его можно explodeить для вывода.

Впрочем, можно также просто отсортировать по ORDER BY u.user, l.date_time, чтобы логи одного пользователя шли подряд.
Тогда перед выводом, можно проверять, что в текущей строке пользователь, как в предыдущей и не выводить его.

Также можно произвести группировку результатов выборки самостоятельно:

$list = [['user': 'alice', 'date_time': 0, 'ip': '::1'], ['user': 'alice', 'date_time': 2, 'ip': '::1']];
$grouped = [];
foreach ($list as $row) {
  if (!isset($grouped[$row['user']])) grouped[$row['user']] = [];
  grouped[$row['user']][] = $row;
}
unset($list);

Теперь несложно каждому пользователю вывести необходимый rowspan, например.

READ ALSO
Не выполняется php-код из примера

Не выполняется php-код из примера

Я начал изучать производство сайтов, и первый же пример из книжки не хочет выполняться

212
Взлом почтового ящика [требует правки]

Взлом почтового ящика [требует правки]

Как взломать чужой почтовый ящик?

263
php замена двух букв друг на друга

php замена двух букв друг на друга

Здравствуйте, нужен код для следующего дела: надо заменить две разные буквы в слове на них же ( буквы вручную надо вписывать, "м" и "п"), то есть...

244
PHP spl_autoload_register не работает

PHP spl_autoload_register не работает

Добрый деньРади самообучения решил написать свой фреймворк, столкнулся со следующей проблемой

271