Я использую 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;
}
Проблема с вашим запросом заключается в том, что он находит данные для последнего посещения с каждого 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
application_id = '8'
иm2.visit_id IS NULL
?