LEFT JOIN不能正常工作

时间:2015-05-30 16:23:14

标签: php mysqli left-join

我使用LEFT JOIN只根据我的应用程序的访问者IP检索访问者的最新数据库条目。不知怎的,它无法正常工作。每当我使用' AND m1.application_id =' 7''它以7作为ID获取应用程序的所有连接。每当我尝试使用8作为ID获取应用程序的连接时,在数据库中存储连接时没有结果。我做错了吗?

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时,我的数据库中会存储一个新条目。我希望根据最新的访问时间戳(这将是用户ip_address的最高visit_id条目)在我的管理员窗口中显示这些访问次数,但我不想显示重复的条目。

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

我的数据库表名为&#39; tumblr_tracker &#39;。我有以下栏目: - visit_id(自动增量) - application_id - IP地址 - 邮政编码 - 城市 - 地区 - 国家 - 网络 - 时间戳

这是我目前的代码:

$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;
}

1 个答案:

答案 0 :(得分:0)

您的查询的问题在于,在考虑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