mrusklon
@mrusklon
если долго мучится - что нибудь получится

Как сделать запрос в БД или обработать на php для объединения часов одного дня?

Не знаю как сформулировать вопрос, может кто подскажет , я исправлю.
Дело вот в чем , есть таблица:
D0T4TmM.png
мне нужно за одного пользователя складывать часы если дата одна и таже

что из этой таблицы при выборке получился результат
XDDs5uw.png

сейчас мой запрос выглядит так:
$sql33 = "SELECT DISTINCT users.`users_id`, users.`name`,user_dolg.`date` ,user_dolg.`user_id`, SUM(user_dolg.hours) sub_hours
FROM `user_dolg` 
LEFT OUTER JOIN `users` ON user_dolg.`user_id`=users.`users_id`
WHERE `date` BETWEEN  '" . $starttime . "' AND '" . $endtime . "'
GROUP BY users.`name`

Сейчас он складывает за все даты в кучу , а надо только те даты в которых есть 2 и больше записей
может делать простой запрос и на php потом складывать дни?

кто что посоветует?
  • Вопрос задан
  • 79 просмотров
Решения вопроса 1
LaRN
@LaRN
Senior Developer
Можно вот так попробовать.

Я убрал из select дублирующиеся поля users.`users_id` и user_dolg.`user_id`

Так как по полю user_dolg.`date` происходит отбор, но оно не включено в список агрегирующих полей, нужно к
нему применить агрегирующую функцию, например так MAX(user_dolg.`date`) либо добавить поле в список агрегирующих полей.

Так как вы присоединяете таблицу `users` левым джойном, то в случае отсутствия в ней записи по users_id в поля этой таблицы вернется значение NULL нужно бы обработать этот случай используя функцию ISNULL например или IFNULL. Если же в таблице `users` всегда есть запись для users_id из таблицы user_dolg, то лучше бы LEFT OUTER JOIN заменить на INNER JOIN. Я в запросе написал вариант с INNER JOIN.

SELECT DISTINCT 
       users.`users_id`,
       users.`name`,
       user_dolg.`date`,
       SUM(user_dolg.hours)  AS sub_hours
  FROM `user_dolg` 
 INNER JOIN `users`
    ON users.`users_id` = user_dolg.`user_id`
 WHERE user_dolg.`date` BETWEEN  '" . $starttime . "' AND '" . $endtime . "'
 GROUP BY users.`users_id`, users.`name`, user_dolg.`date`
HAVING COUNT(1) > 1
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
BojackHorseman
@BojackHorseman Куратор тега PHP
...в творческом отпуске...
SELECT `users_id`, `date`, SUM(`hours`)
FROM `user_dolg` 
GROUP BY `users_id`, `date`
HAVING COUNT(1) > 1
Ответ написан
@VicTHOR
люблю регулярки :3
Когда делаешь группировку по столбцу, остальные столбцы обязательно нужно сагрегировать.
SELECT `user_id`, MAX(`date`), SUM(`hours`)
    FROM `user_dolg`
    GROUP BY `user_id`
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы