Правила     Закладки     Карма    Календарь    Журналы    Помощь    Поиск    PDA    Чат   
        СМС-ки
   
Пейджер выключен!
Страницы: (4) [1] 2 3 ... Последняя » ( Перейти к первому непрочитанному сообщению )  
Фильтр авторов:    показать 
  скрыть
  Ответ в темуСоздание новой темыСоздание опроса

> Перекрестный запрос с Count и группировкой, Помогите осилить логику
grey4eg  
 ۩  [x] Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Новичок
*

Профиль
Группа: Пользователь
Сообщений: 16
Пользователь №: 42800
На форуме: 9 месяцев, 13 дней
Карма:




Здравствуйте. Прошу помощи в решении вывода данных из MySQL PHP-средствами.
Есть две таблицы:
1. Users
user posted image


2. Log
user posted image

Хочу получить данные вот в таком вот виде:
user posted image

То есть вывести статистику, где бы отображалась дата, потом все пользователи, проявлявшие активность в эту дату и количество их действий (в логи пишется + 1 при конкретном действии пользователя, дата автоматом встает сегодняшняя).

Просто количество действий по датам вывести не проблема:


$query = "select date, count(date) from group by date";
$result = mysql_query($query);
echo "<center><table><caption>Количество поисковых запросов по дням</caption><tr><th>Дата</th><th>Кол-во запросов</th></tr>";
while($row = mysql_fetch_array($result))
{
$rowdate = $row['date'];
echo $rowdate;
$sdate = new DateTime($row['date']);
echo "<tr><td width='10%'>".$sdate->format('d.m.Y')."</td>";
echo "<td align='center'>".$row ['count(date)']."</td></tr>";
}
echo "</center></table>";


Выводит нормальную таблицу вида дата - число записей на дату.

А вот дальше ничего не получается. Пытался включить в цикл While еще один запрос, выводящий хотя бы uid - в итоге не выводится вообще ничего, просто как будто этих команд нет:
while($row = mysql_fetch_array($result)) 
{
$rowdate = $row['date'];
echo $rowdate;
$sdate = new DateTime($row['date']);
echo "<tr><td width='10%'>".$sdate->format('d.m.Y')."</td>";
//************************************************************************************************** ****
$query2 = "SELECT * FROM log WHERE date=$rowdate";
$result2 = mysql_query($query2);
while($row2 = mysql_fetch_array($result2))
{
echo ">>>>>>".$row2['user_id']."<<<<<<";
}

//************************************************************************************************** *******
echo "<td align='center'>".$row ['count(date)']."</td></tr>";
}
echo "</center></table>";

Подскажите, может есть какие-то тонкости в построении запросов внутри цикла обработки другого запроса?
Или как-то можно представленный пример сделать одним каким-нибудь архисложным запросом к бд?

Или может у меня изначально структура неверная и поэтому затык? Я вот думаю, количество записей считать необходимо, чтобы в итоге, при выводе таблицы с результатами было бы откуда указать <tr rowspan="$data['count()']">

Это сообщение отредактировал grey4eg - 5.04.2016 - 11:56
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Kusss  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 1391
Пользователь №: 28976
На форуме: 5 лет, 5 месяцев, 19 дней
Карма: 78




SELECT 
l.date, COUNT(l.id) AS `count`,
u.Name, u.Gorod
FROM
`Log` AS l
LEFT JOIN
`Users` AS u ON u.id = l.`Uid`
GROUP BY
l.`Date`,
l.`Uid`
Не проверял.

Это сообщение отредактировал Kusss - 5.04.2016 - 12:12
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Valick  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 5549
Пользователь №: 35718
На форуме: 4 года, 1 месяц, 29 дней
Карма: 170




Цитата (grey4eg @ 5.04.2016 - 10:55)
Подскажите, может есть какие-то тонкости в построении запросов внутри цикла обработки другого запроса?

тонкость всего одна, их не должно быть


--------------------
wmr - R281553014107
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
grey4eg  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Новичок
*

Профиль
Группа: Пользователь
Сообщений: 16
Пользователь №: 42800
На форуме: 9 месяцев, 13 дней
Карма:




Спасибо, получилось с помощью с примером от Kusss. Однако, при обработке цикла выводится так:
10.03.2004
-----Маша
---------3
10.03.2004
-----Петя
---------4
10.03.2004
-----Вася
---------2

А как сделать так, чтобы выводимые даты лепились в кучку и при этом не использовать вложенный цикл, так чтобы вышло так:
10.03.2004
-----Маша
---------3
-----Петя
---------4
-----Вася
---------2
10.03.2004
-----Петя
---------4
-----Вася
---------2 и тд? Как можно сгруппировать даты?

PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
sergeiss  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Сидел он, дум великих полон - и вдаль глядел
******

Профиль
Группа: Эксперт
Группа переписки
Сообщений: 15111
Пользователь №: 4190
На форуме: 8 лет, 11 месяцев, 12 дней
Карма: 448




Цитата (grey4eg @ 5.04.2016 - 21:19)
А как сделать так, чтобы выводимые даты лепились в кучку и при этом не использовать вложенный цикл, так чтобы вышло так:

Какой такой вложенный цикл??? Ты данные получил, при выводе анализируй, что выводишь. Если дата такая же, как у предыдущей строки, то не выводишь её. Если же отличается либо это первая строка, то выводишь.


--------------------
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
PMICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
grey4eg  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Новичок
*

Профиль
Группа: Пользователь
Сообщений: 16
Пользователь №: 42800
На форуме: 9 месяцев, 13 дней
Карма:




Спасибо, все получилось примерно вот так:
$r ="";
while ($row = mysql_fetch_assoc($result))
{
if($row['date']!=$r){
echo "<h2>".$row['date']."</h2>";
$r=$row['date'];
}
echo "<p>".$row['name']."</p>";
}
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
grey4eg  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Новичок
*

Профиль
Группа: Пользователь
Сообщений: 16
Пользователь №: 42800
На форуме: 9 месяцев, 13 дней
Карма:




Подскажите, а как можно подсчитать количество выдаваемых строк, чтобы получить какое-то число?
Я пытаюсь вывести на экран количество полученных имен:
echo count ($row['name']);

однако всегда получаю 1, вне зависимости от того, в цикле я это вывожу или за его пределами.
Причем вывод в цикле
echo ($row['name'];

выдает несколько имен.
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Valick  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 5549
Пользователь №: 35718
На форуме: 4 года, 1 месяц, 29 дней
Карма: 170




grey4eg, БД не отдаёт результат целиком, вы в цикле while вытаскиваете результат по одной строке за каждую итерацию при помощи mysql_fetch_assoc.


--------------------
wmr - R281553014107
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
grey4eg  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Новичок
*

Профиль
Группа: Пользователь
Сообщений: 16
Пользователь №: 42800
На форуме: 9 месяцев, 13 дней
Карма:




Подскажите, пожалуйста, как можно (и можно ли) при одном запросе сгруппировать одни и те же данные по-разному?
Вот таким запросом:
$result1 = mysql_query("
SELECT
l.date, COUNT(l.user_id) AS `count`,
u.name, u.gorod
FROM
`log` AS l
LEFT JOIN
`users` AS u ON u.user_id = l.`user_id`

WHERE l.date BETWEEN '"
.$start_date." 00:00:00' AND '".$end_date." 23:59:59'

GROUP BY
u.gorod,
l.`user_id`

ORDER BY u.`filial`"
);

Я получаю данные и таблицу вида:
| Тверь |
|Маша | 5 |
|Петя | 5 |
|Саша | 5 |
| Ростов |
|Маша | 5 |
|Петя | 7 |
|Саша | 10 |

Все вроде бы как надо, но нужно вывести еще сумму по всему городу, а стоит группировка по l.`user_id`. Если оставить только
GROUP BY
u.gorod

Получится
| Тверь 15 |
|Маша | 5 |
| Ростов 22 |
|Маша | 5 |

Что, в целом, верно, но теперь не хватает детализации. Как можно подружить две группировки сразу?
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Kusss  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 1391
Пользователь №: 28976
На форуме: 5 лет, 5 месяцев, 19 дней
Карма: 78




я бы в php посчитал.
$city = array();
$result = mysql_query($query);
while($row = mysql_fetch_assoc($result)){
$city[ $row['gorod'] ] += $row['count'];
}
echo '<pre>';
print_r($city);
echo '</pre>';

PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
TMake  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Журнал
Группа: Форумчанин
Завсегдатай форума
Сообщений: 3106
Пользователь №: 16333
На форуме: 8 лет, 1 месяц, 2 дня
Карма: 58




Цитата (Kusss @ 7.04.2016 - 23:02)
я бы в php посчитал.

ты считаешь это верное решение? то что можно сделать через выборку ты тянешь в память, а потом считаешь.
Цитата (grey4eg @ 7.04.2016 - 21:41)
Как можно подружить две группировки сразу?

например в подзапросе
PM
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Valick  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 5549
Пользователь №: 35718
На форуме: 4 года, 1 месяц, 29 дней
Карма: 170




TMake, в данном случае это не особо критично с точки зрения вычислений и нагрузки, но лично я пишу код с таким расчётом, что бы при изменении запроса не пришлось его менять, ну или изменения должны быть минимальны. Опять же в данном случае это окончательный запрос, но может быть ситуация при которой подобный запрос может быть промежуточным, вот тогда после вычислений на стороне РНР обычно возникают запросы в цикле, а это уже грешно по отношению к БД. Так что вы правы, осилить задачу на уровне СУРБД и интересно и полезно.



--------------------
wmr - R281553014107
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Kusss  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 1391
Пользователь №: 28976
На форуме: 5 лет, 5 месяцев, 19 дней
Карма: 78




TMake
ну тут либо так, или 2 запроса. И если критикуешь - давай своё решение.

Это сообщение отредактировал Kusss - 8.04.2016 - 14:49
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
twin  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Глухой нуб
******

Профиль
Группа: Администратор
Почтальон группы
Сообщений: 15772
Пользователь №: 6543
На форуме: 8 лет, 3 месяца, 15 дней
Карма: 299

Трезвый :
6 лет, 24 дня


Цитата (TMake @ 8.04.2016 - 10:17)
то что можно сделать через выборку ты тянешь в память, а потом считаешь.

Ты считаешь, что память СУБД не важна? Ты глубоко заблуждаешься. Это как раз более тонкое место.


--------------------
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Зачем ворошить старое, когда можно наворотить новое?

user posted image
PMСайт пользователяICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
depp  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 330
Пользователь №: 40589
На форуме: 2 года, 1 месяц, 14 дней
Карма: 21




Цитата (twin @ 8.04.2016 - 15:37)
Цитата (TMake @ 8.04.2016 - 10:17)
то что можно сделать через выборку ты тянешь в память, а потом считаешь.

Ты считаешь, что память СУБД не важна? Ты глубоко заблуждаешься. Это как раз более тонкое место.

откуда эта информация у вас?
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
  Быстрый ответ
Информация о Госте
Введите Ваше имя
Кнопки кодов
Для вставки цитаты, выделите нужный текст и
НАЖМИТЕ СЮДА
Введите сообщение
Смайлики
:huh:  :o  ;) 
:P  :D  :lol: 
B)  :rolleyes:  <_< 
:)  :angry:  :( 
:unsure:  :blink:  :ph34r: 
     
Показать всё

Опции сообщения  Включить смайлики?
 Включить подпись?
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:

Опции темыСтраницы: (4) [1] 2 3 ... Последняя » Ответ в темуСоздание новой темыСоздание опроса