我正在制作一个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数组,用于将已显示给当前用户的用户进行通信。只要前端(用户1)上的用户向右或向左滑动,其他用户的配置文件(用户2)上的用户2的uid都可以添加到用户1已经滑动的用户数组中。然后,我可以在SQL语句中说只返回不在当前用户的uid的“ alreadyPresentedWith”列中的用户。
问题: 我研究了在SQL中引用大量值的过程,发现关系数据库中每一列的值不应超过一个。但是,根据我给定的技能和经验,这是我可以想象完成此任务的唯一方法。
我只想从经验丰富的php / SQL开发人员那里获得反馈,以了解哪个方向最适合我解决此类问题。
答案 0 :(得分:2)
您应该有一个表,例如swipes
,每个动作一行。说:
create table swipes (
swipes_id int auto_increment primary key,
swiper_uid binary(16),
swipee_uid binary(16),
action varchar(5), -- 'left', 'right', 'none'
created_at datetime default now(),
foreign key (swiper_uid) references persons(uid),
foreign key (swipee_uid) references persons(uid)
);
通过OP编辑 因此,解决方案很简单。我按照建议进行了滑动表格的创建,创建了一个API端点,该端点每次发生滑动时都会在表格中插入“滑动”(在我的情况下,我们不需要存储用户向左还是向右滑动),然后更新我的端点中的SQL语句获取附近的用户。
在SQL语句中,我添加了一个NOT EXISTS
检查以引用滑动表,并检查某个条目是否将当前用户作为“刷卡器”,并将查询返回的用户作为“刷卡器”。这就是现在获取附近用户的php文件中的准备好的语句。
$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<>? AND NOT EXISTS(SELECT NULL
FROM swipes s
WHERE s.swiperUid=? AND u.uid=s.swipeeUid)";
//Bind parameters to the placeholders
mysqli_stmt_bind_param($stmt, "dddiiiiiss", $lat, $lat, $lng, $radius, $gender, $maxAge, $minAge, $type, $uid, $uid);