Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Страницы 1
Есть запрос
$data = Analytics::select($stat)->whereBetween('date', [$daterangepicker_start, $daterangepicker_end])->groupBy($stat)->get();
я хочу к каждому элементу коллекции добавить 2 поля - виситорс и виситс, но вот пока не пойму как.
Просто по сути нужно выполнить доп запрос
Analytics::select($stat)->whereBetween('date', [$daterangepicker_start, $daterangepicker_end])->where($stat, '=', сюда передать ячейку из запроса который выше)->groupBy($stat)->get();
и что бы все подходящие элементы поместились в доп ячейку каждого эелемента коллекции.
Второй запрос один в один только без гроуп бай
пс в постгрии если делать гроупбай то он просит добавить эту ячейку в селект, это косяк самого постгриии?
Не в сети
пс в постгрии если делать гроупбай то он просит добавить эту ячейку в селект, это косяк самого постгриии?
Нет, это MySQL в некоторых случаях слишком добрый, что позволяет селектить поля, которые не участвуют в группировке или агрегатных функциях.
Многие разработчики, особенно самоучки, и не подозревают, что их запросы работают, только потому, что MySQL лояльный.
А сам твой вопрос - не понял.
Распиши подробнее.
Изменено covobo (16.07.2017 23:15:00)
Не в сети
Нужно вывести аналитику на страницу.
Есть таблица
Нужно таблицей вывести
дата / кол-во посителей / кол-во просмотренных страниц
в дату попадает ип сити коунтри ос исп и тп. Как лучше вот это сделать?
За пояснение про бд отельное спасибо!
Изменено adams (16.07.2017 23:26:39)
Не в сети
а количество посетителей - это количество уникальных ип?
Не в сети
Да!
Количество просмотров - это всего сколько ип.
Не в сети
SELECT count(ip) AS visits, count(DISTINCT ip) AS visitors
FROM table
WHERE date BETWEEN '2017-07-16 00:00:00' AND '2017-07-16 23:59:59'
$res = \DB::table('analytics')
->select(\DB::raw('count(ip) AS visits, count(DISTINCT ip) AS visitors'))
->whereBetween('date', [$daterangepicker_start, $daterangepicker_end])
->get();
Вроде так.
Не в сети
А можно на выходе получить массив или объект
в котором есть ячейка дата / виситорс / виситс
что бы во вьювере просто форычем перебрать и вывести итоговую таблицу? я этого пытаюсь добиться
Не в сети
а дата в каком формате? если datetime, то
$res = \DB::table('analytics')
->select(\DB::raw('DATE_FORMAT(date, "%Y-%m-%d") as day, COUNT(ip) AS visits, COUNT(DISTINCT ip) AS visitors'))
->whereBetween('date', [$daterangepicker_start, $daterangepicker_end])
->groupBy(\DB::raw('1'))
->get();
Забегая вперед по поводу GROUP BY 1, это элемент оптимизации.
https://stackoverflow.com/questions/739 … -by-1-mean
Изменено covobo (17.07.2017 00:03:22)
Не в сети
Дата это фильтр...
в дату попадает ип сити коунтри ос исп и тп.
Не в сети
тебе осталось только свою фильтрацию добавить
$query = \DB::table('analytics')
->select(\DB::raw('DATE_FORMAT(date, "%Y-%m-%d") as day, COUNT(ip) AS visits, COUNT(DISTINCT ip) AS visitors'))
->groupBy(\DB::raw('1'));
if ($data['date_start']) {
$query->where('date', '>=', $data['date_start']);
}
if ($data['ip']) {
$query->where('ip', $data['ip']):
}
if ($data['city']) {
$query->where('city', $data['city']);
}
...etc...
$result = $query->get();
Изменено covobo (17.07.2017 00:06:56)
Не в сети
Если честно немного не то, можно с вами списаться на емейл? если что я готов оплатить консультацию!
Не в сети
Я передаю пост запросом переменку $stat, она будет равна к примеру country
Я делаю запрос
$data = Analytics::select($stat)->whereBetween('date', [$daterangepicker_start, $daterangepicker_end])->groupBy($stat)->get();
Получаю объект из уникальных параметров по столбцу (ячейка data в будущей таблице), но мне нужно рядом вывести количество грубо уникальных ип и количество всего ип.
Хотелось бы сделать это все в 1 запросе и что бы на выходе был 1 объект или 1 массив такого вида
$data = [
['us', 10, 100],
['ca', 20, 300]
]
и этот массив я передаю во вьювер и спокойно перебираю форычем создаю таблицу.
Изменено adams (17.07.2017 00:20:24)
Не в сети
Я так полагаю ты хочешь группировать запрос в зависимости от пользовательского ввода?
Типа - посчитать просмотры и посетителей по городу?
Я сейчас уже собирался уходить, но все же "накидаю" тебе примерно то, что ты должен сделать.
$query = \DB::table('analytics')->groupBy(\DB::raw('1'));
if ($groupBy == 'city') {
$query->select(\DB::raw('city as data, COUNT(ip) AS visits, COUNT(DISTINCT ip) AS visitors'));
} else if ($groupBy == 'ip' ) {
$query->select(\DB::raw('ip as data, COUNT(ip) AS visits, COUNT(DISTINCT ip) AS visitors'));
} else if ($groupBy == 'date') {
$query->select(\DB::raw('date as data, COUNT(ip) AS visits, COUNT(DISTINCT ip) AS visitors'));
}
...здесь код, который умеет фильтровать....
if ($filter['date_start']) {
$query->where('date', '>=', $data['date_start']);
}
if ($filter['ip']) {
$query->where('ip', $data['ip']):
}
if ($filter['city']) {
$query->where('city', $data['city']);
}
$result = $query->get();
P.S. Выглядит некрасиво, но, решил, что лучше ответить сейчас, чем поздно, но красиво.
Изменено covobo (17.07.2017 00:20:34)
Не в сети
Чучуть выше описал подробнее, разве нет дургих вариантов, кроме как писать проверки, мне показалось вы слегка не поняли что я делаю))
Не в сети
Чучуть выше описал подробнее, разве нет дургих вариантов, кроме как писать проверки, мне показалось вы слегка не поняли что я делаю))
В общем, посчитать то, что надо - "COUNT(ip) AS visits, COUNT(DISTINCT ip) AS visitors".
Как фильтровать и группировать - уже есть примеры.
Варианты как сделать - показал, можно и по другому.
Не обязательно писать кучу if-else, я продемонстрировал вариант.
Не в сети
$data = Analytics::selectRaw("$stat, COUNT(DISTINCT ip) AS visitors, COUNT(ip) AS visits")->whereBetween('date', [$daterangepicker_start, $daterangepicker_end])->groupBy($stat)->get();
Решил задачу!Спасибо!
Я Вам, что-то должен?
Изменено adams (17.07.2017 00:43:53)
Не в сети
Решил задачу!Спасибо!Я Вам, что-то должен?
Очень непривычно слышать такое в СНГ комьюнити.
Нет, я здесь ради интереса)
Спасибо.
Не в сети
Страницы 1