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
我使用 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