#php #mysql
#php #mysql
Вопрос:
У меня есть таблица с закладками lz_link
и таблица, в которой хранится каждый клик по вызываемым ссылкам lz_hits
. Затем я хотел бы отобразить все закладки, упорядоченные по количеству кликов, которые они получили за последнюю неделю.
Пока это мой запрос:
SELECT count(hit_time) as cnt, descr, l_id, url
FROM lz_link
LEFT JOIN lz_hits ON hit_lz=l_id
WHERE link_aktiv=1
amp;amp; hit_time >= '.(time()-Options::$most_hits_hit_days*3600*24).'
GROUP BY hit_lz
ORDER BY cnt DESC
LIMIT '.Options::$boxes_count.';
Это работает, но я получаю только одну закладку, которую посетили ноль раз за данный период. Любые другие закладки, которые не были посещены, не отображаются вообще.
Почему это происходит?
Как я могу получить все закладки, даже если они не были посещены за данный период?
Комментарии:
1. Вы проверили значение
(time()-Options::$most_hits_hit_days*3600*24)
в php?
Ответ №1:
Переместите любое условие, которое применяется к lz_hits, из предложения WHERE в предложение ON. Извините, я не могу отправить запрос — я на мобильном устройстве.
РЕДАКТИРОВАТЬ: может быть, это может помочь?
SELECT count(hit_time) as cnt, descr, l_id, url
FROM lz_link
LEFT JOIN lz_hits ON hit_lz=l_id
AND hit_time >= '.(time()-Options::$most_hits_hit_days*3600*24).'
WHERE link_aktiv=1
GROUP BY hit_lz
ORDER BY cnt DESC
LIMIT '.Options::$boxes_count.';
Предполагая, что link_active и hit_lz взяты из таблицы lz_link. Если link_active нет, просто переместите его в предложение ON, как я сделал с hit_time.
Что касается hit_lz — группировка по столбцу из левого соединения не имеет большого смысла. Рассмотрите возможность использования другого столбца для группировки.
Ответ №2:
Запрос в том виде, в каком он написан, неоднозначен. Обычно при использовании GROUP BY было бы ошибкой включать неагрегированные поля в список ВЫБОРА, которые не включены в предложение GROUP BY. MySQL, по-видимому, допускает это, но результат считается неоднозначным. Не будучи полностью уверенным, какие поля в каких таблицах есть, я не могу быть полностью уверен, но этот запрос может дать желаемые результаты. Я предполагаю, что здесь это l_id
находится в lz_link
и hit_lz
находится в lz_hits
.
SELECT count(hit_lz) as cnt, descr, l_id, url
FROM lz_link
LEFT JOIN lz_hits ON hit_lz=l_id
AND hit_time >= '.(time()-Options::$most_hits_hit_days*3600*24).'
WHERE link_aktiv=1
GROUP BY l_id, descr, url
ORDER BY cnt DESC