在SQL查询中传递大量值的最佳方法?

时间:2019-07-06 14:53:36

标签: php mysql sql rest

我正在制作一个iOS应用程序,该应用程序使用了类似于tinder的滑动/匹配功能。我有一个MySQL数据库,该数据库用于将用户与满足用户搜索条件的人员进行匹配。 Swiping feature

滑动功能。  ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀  ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ My users' search criteria 我的用户的搜索条件。 What my table base of users looks like 我的用户表基础是什么样的。

我已经使用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开发人员那里获得反馈,以了解哪个方向最适合我解决此类问题。

1 个答案:

答案 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语句获取附近的用户。

My 'swipes' table

在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);