【发布时间】:2019-07-06 14:53:36
【问题描述】:
我正在制作一个 iOS 应用程序,它利用类似于 tinder 的滑动/匹配功能。我有一个 MySQL 数据库,用于将用户与满足用户搜索条件的人进行匹配。
滑动功能。 ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ 我的用户的搜索条件。 我的用户表基础是什么样的。
我使用 php 和 SQL 创建了一个 API 端点,用于在进行更改时更新每个用户的信息,并获取附近所有符合用户搜索条件的用户。
这是获取附近用户的 php 的样子。
$uid = strval($_GET['uid']);
$lat = floatval($_GET['lat']);
$lng = floatval($_GET['lng']);
$minAge = intval($_GET['minAge']);
$maxAge = intval($_GET['maxAge']);
$gender = intval($_GET['gender']);
$radius = intval($_GET['radius']);
$type = intval($_GET['type']);
// This SQL statement selects users from the table 'users' so long as
//they are within x miles of the user's location and within the age
//range and gender requirements
$sql = "SELECT *,
(((acos(sin((?*pi()/180)) * sin((`lat`*pi()/180))+cos((?*pi()/180)) * cos((`lat`*pi()/180)) * cos(((?- `lng`)*pi()/180))))*180/pi())*60*1.1515)
AS distance
from users having distance<? AND gender=? AND age<? AND age>? AND type=? AND uid<>?";
//Bind parameters to the placeholders
mysqli_stmt_bind_param($stmt, "dddiiiiis", $lat, $lat, $lng, $radius, $gender, $maxAge, $minAge, $type, $uid);
//Run parameters inside database
mysqli_stmt_execute($stmt);
发出此请求的 URL 可能如下所示:
https://mywebsitename.com/getNearbyUsers.php?uid=4pW2I1gpq5VHCHEdm0aEfTRgJO92&lat=38.461822509765625&lng=-90.32567239374883&minAge=18&maxAge=100&gender=2&radius=50&type=3
我的问题:
现在,每当用户 (user1) 在另一个用户 (user2) 上向右或向左滑动时,我想跟踪这个 user2 是否已经呈现给 user1,以便将来不会出现。
我最初打算做什么:
解决这个问题的第一个想法是在我的 SQL 数据库中创建另一个列,该列本质上是一个 uid 数组,用于传达哪些用户已经显示给当前用户。每当前端的用户 (user1) 向右或向左滑动另一个用户的配置文件 (user2) 时,user2 的 uid 就可以添加到 user1 已经刷过的用户数组中。然后,我可以在 SQL 语句中说只返回不在当前用户的 uid 的“alreadyPresentedWith”列中的用户。
问题: 我研究过在 SQL 中引用大量值,发现关系数据库中每列的值不应超过一个。但是,以我给定的技能和经验,这是我能想象完成这项任务的唯一方法。
我只是希望获得更多经验丰富的 php/SQL 开发人员的反馈,告诉我哪个方向最适合我解决这类问题。
【问题讨论】:
-
如果您要添加另一个 表 而不是“我的 SQL 数据库中的另一列”怎么办?两列,“用户 A”和“用户 B”,每个刷过“用户 B”的“用户 A”都有一行。然后你会使用子查询过滤掉。
-
手机接缝上的滑动是否有序?只需使用手机中的本地存储来保护滑动 ID,并在您获取下一组可能的滑动时使用基于(大于 MAX(swipe_id))的过滤器..
-
@RaymondNijland 我考虑过这样做,但根据用户在搜索中传递的搜索条件,返回的顺序可能会改变。在这种情况下,我觉得最好在后端解决所有问题。
-
“我考虑过这样做,但根据用户在搜索中传递的搜索条件,返回的顺序可能会改变。”注意到..返回顺序已经是非确定性的(随机的),因为您没有包含确定性的
ORDER BY,其中至少一列具有主键或唯一键.. 非唯一值上的ORDER BY将给出非确定性绑定值的(随机)结果。