выберите все элементы из таблицы A, упорядоченные по количеству записей в таблице B, связанных с каждым элементом

#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