LEFT JOIN не работает должным образом

1

Я использую LEFT JOIN только для получения последней записи db посетителя на основе IP-адресов посетителей для моих приложений. Как-то он не работает правильно. Всякий раз, когда я использую 'AND m1.application_id =' 7 '', он получает все соединения для приложения с 7 в качестве идентификатора. Всякий раз, когда я пытаюсь получить соединения для приложения с 8 как идентификатор, нет результата, пока в базе данных хранятся соединения. Я делаю что-то неправильно?

SELECT m1.* FROM 'tumblr_tracker' m1
LEFT JOIN 'tumblr_tracker' m2
ON (m1.ip_address = m2.ip_address AND m1.visit_id < m2.visit_id)
WHERE m2.visit_id IS NULL AND m1.application_id = '8'
ORDER BY m1.visit_id
DESC LIMIT 20

отредактированный

Я пытаюсь сделать следующее: я храню каждый визит Tumblr в моей базе данных. Я храню следующие данные: visit_id, ip_address, postal_code, city, region, country, timestamp. Поэтому, когда кто-то посещает мой Tumblr, в моей базе данных хранится новая запись. Я бы хотел показать эти посещения в моей админпанели на основе последней отметки времени посещения (которая будет находиться в самой высокой записи visit_id для пользователей ip_address), но я не хочу показывать повторяющиеся записи.

Итак, в основном: пользователь с IP-адресом: 88.88.88.88 посещает мою страницу 5 раз, в моей базе данных будет 5 записей с этим ip_address. Я хочу видеть все данные последней записи.

Моя таблица db называется tumblr_tracker. У меня есть следующие столбцы: - visit_id (AUTO INCREMENT) - application_id - ip_address - postal_code - город - регион - страна - сеть - метка времени

Это мой текущий код:

$show_tumblr_connections = array(); 
$get_tumblr_connections = mysqli_query($mysqli,"SELECT m1.* FROM 'tumblr_tracker' m1 LEFT JOIN 'tumblr_tracker' m2 ON (m1.ip_address = m2.ip_address AND m1.visit_id < m2.visit_id) WHERE m1.application_id = '".$db_application_id."' AND m2.visit_id IS NULL ORDER BY m1.visit_id DESC LIMIT 20") OR die (mysqli_error($mysqli));
while($row = mysqli_fetch_array($get_tumblr_connections)){
    $tumblr_connections_array = array( 'ip_address' => $row['ip_address'],
    'postal_code' => $row['postal_code'],
    'city' => $row['city'],
    'region' => $row['region'],
    'country' => $row['country'],
    'network' => $row['network'],
    'timestamp' => $row['timestamp']);
    $show_tumblr_connections[] = $tumblr_connections_array;
}
  • 0
    Похоже, ваш собственный запрос опередил вас. Вы уверены, что есть записи для application_id = '8' и m2.visit_id IS NULL ?
  • 0
    Может быть полезно опубликовать определения таблиц и некоторые примеры данных
Показать ещё 2 комментария
Теги:
mysqli
left-join

1 ответ

0
Лучший ответ

Проблема с вашим запросом заключается в том, что он находит данные для последнего посещения с каждого IP-адреса перед рассмотрением application_id. Когда вы затем фильтруете application_id, вы получите результаты только для IP-адресов, где последний визит связан с этим application_id.

Чтобы исправить ваш запрос, вам нужно будет изменить условие JOIN для рассмотрения application_id, например:

SELECT m1.* FROM 'tumblr_tracker' m1
LEFT JOIN 'tumblr_tracker' m2
ON (m1.ip_address = m2.ip_address
    AND m1.application_id = m2.application_id
    AND m1.visit_id < m2.visit_id)
WHERE m2.visit_id IS NULL AND m1.application_id = '8'
ORDER BY m1.visit_id DESC
LIMIT 20
  • 0
    Это сработало, теперь работает! Спасибо!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню