PHP/MySQL使前10名脱颖而出

PHP/MySQL使前10名脱颖而出,php,mysql,select,Php,Mysql,Select,用户可以输入其首选项以查找其他用户。 现在,根据这些输入,我想获得与首选项最匹配的前10名 我想的是: 1) 创建解析用户首选项的select语句 if ($stmt = $mysqli->prepare("SELECT sex FROM ledenvoorkeuren WHERE userid = you")) $stmt->bind_result($ownsex); 2) 创建一个select语句,检查除您自己以外的所有用户 if ($stmt = $mysqli->pr

用户可以输入其首选项以查找其他用户。 现在,根据这些输入,我想获得与首选项最匹配的前10名

我想的是:

1) 创建解析用户首选项的select语句

if ($stmt = $mysqli->prepare("SELECT sex FROM ledenvoorkeuren WHERE userid = you"))
$stmt->bind_result($ownsex);
2) 创建一个select语句,检查除您自己以外的所有用户

if ($stmt = $mysqli->prepare("SELECT sex FROM ledenvoorkeuren WHERE userid <> you"))
$stmt->bind_result($othersex);
4) 如果首选项匹配->变量+10%,则从值为0的变量开始

问题是,我可以为所有成员这样做,但我如何才能选择前10名??? 我想我需要在SQL语句中这样做,但我不知道如何

当然,这只是我的一个偏好,也是我的代码的一个超级简单的版本,但是你会明白的。大概有15个首选项设置

//编辑//


我也想看看屏幕上的比赛评分是多少

在查询中使用
限制
偏移

SELECT sex FROM ledenvoorkeuren WHERE userid = you limit 10 offset 0

这将给出前10位用户的数据。

您可以在查询中设置如下限制:

SELECT sex FROM ledenvoorkeuren WHERE userid <> yourid AND sex <> yourpreferredsex limit 0, 10
从Ledenvoorkuren中选择性别,其中用户ID yourid和性别yourPreferred性别限制为0,10
其中“0”是偏移量,“10”是限制

更多信息

您可以试试这个

SELECT sex FROM ledenvoorkeuren WHERE userid = you limit 0, 10 order by YOUR_PREFERENCE

嗯,从一开始这是一个很好的问题,所以我对它进行了投票,然后浪费了大约1个小时来制作以下内容:)

数据

我在这里的实验中使用了名为
test
的数据库和名为
t
的表

您可以在下面找到显示此表结构的屏幕截图(3个
int
列,1个
char(1)
列)和完整数据

如您所见,一切都相当简单—我们有4列,
id
作为主键,还有一些记录(行)

我们想要实现的目标

我们希望能够根据一些复杂的标准从这个表中选择一组有限的行,包括将几个列的值与所需的参数进行比较

解决方案

我决定为此创建一个函数。SQL语句如下:

use test;

drop function if exists calcMatch;

delimiter //

create function calcMatch (recordId int, neededQty int, neededSex char(1)) returns int
begin
    declare selectedQty int;
    declare selectedSex char(1);

    declare matchValue int;
    set matchValue = 0;

    select qty, sex into selectedQty, selectedSex from t where id = recordId;

    if selectedQty = neededQty then
        set matchValue = matchValue + 10;
    end if;

    if selectedSex = neededSex then
        set matchValue = matchValue + 10;
    end if;

    return matchValue;
end//
delimiter ;
次要解释

函数计算一条特定记录与指定参数集的匹配程度,结果返回
int
值。值越大,匹配越好

函数接受3个参数:

  • recordId—需要计算结果的记录的id(匹配值)
  • neededQty—所需数量。如果记录的数量与之匹配,结果将增加
  • neededSex-NeedSex值,如果记录的性别与之匹配,结果将增加
函数从表中选择via
id
specified记录,用0初始化结果匹配值,然后将每个所需列与所需值进行比较。如果比较成功,返回值将增加10

现场测试

所以,希望这能解决你的问题。您可以在自己的项目中随意使用它,添加所需的参数,并将它们与表中所需的列进行比较


干杯

事实上,我不明白,因为你假设我知道你的应用程序,因此你的问题。请更详细地描述您试图构建的内容,好的,因此您登录并希望找到其他人。要做到这一点,你必须给出偏好,比如性别、年龄、省份等。。。然后,根据这些偏好,你会看到最符合你偏好的前十名。在整个人脉数据库中?或者一个更小的集合?看,然后添加一个
LIMIT
子句。谢谢@eggyal,我要看看那篇文章…看起来像我想要的一样:dlimit10确实给了最多10个用户是的。偏移量给用户1-10。但是我如何做匹配的部分。那么,我该如何检查哪些人最符合用户偏好?@Nick你是基于什么原因匹配用户偏好的?你能告诉我吗。好吧,你可以在where子句中添加你的偏好。不要真正理解你的问题。但我想要这样的东西:如果我能设法让它工作,我会试试。我不知道我怎么能用一种简单的方式把它贴在这里。但我会先尝试链接。谢谢你迄今为止的回答,我可能会回复你:PUhm,我明白这个想法,但我如何才能真正按15种偏好订购?有任何例子…因为我还看不到它起作用。那怎么会给我一个匹配的%?
use test;

drop function if exists calcMatch;

delimiter //

create function calcMatch (recordId int, neededQty int, neededSex char(1)) returns int
begin
    declare selectedQty int;
    declare selectedSex char(1);

    declare matchValue int;
    set matchValue = 0;

    select qty, sex into selectedQty, selectedSex from t where id = recordId;

    if selectedQty = neededQty then
        set matchValue = matchValue + 10;
    end if;

    if selectedSex = neededSex then
        set matchValue = matchValue + 10;
    end if;

    return matchValue;
end//
delimiter ;