LEFT JOIN 无法正常工作

LEFT JOIN not working as it should

我使用 LEFT JOIN 仅根据我的应用程序的访问者 IP 检索访问者的最新数据库条目。不知何故它不能正常工作。每当我使用 'AND m1.application_id = '7'' 时,它都会获取 ID 为 7 的应用程序的所有连接。每当我尝试获取 ID 为 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、城市、地区、国家、时间戳。因此,当有人访问我的 Tumblr 时,一个新条目就会存储在我的数据库中。我想根据最新的访问时间戳在我的管理面板中显示这些访问(这将在用户 ip_address 的最高 visit_id 条目中),但我不想显示重复项条目。

所以基本上:IP 地址为:88.88.88.88 的用户访问我的页面 5 次,我的数据库中将有 5 个条目 ip_address。我只想查看最新条目的所有数据

我的数据库 table 名为“tumblr_tracker”。我有以下几列: - visit_id(自动递增) - 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;
}

您的查询的问题是它在考虑 application_id 之前找到每个 IP 地址的最后一次访问的数据。当您随后过滤 application_id 时,您将只会获得上次访问与 application_id.

相关的 IP 地址的结果

为了更正您的查询,您必须修改 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