2

用户可以输入其偏好来查找其他用户。现在基于该输入,我想获得与偏好最匹配的前 10 个。

我的想法是:

1)创建一个解决用户偏好的选择语句

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

3) 将 select 语句 1 与 select 语句 2 匹配

while ($stmt->fetch()) {
                $match = 0;
                if ($ownsex == $othersex) {
                    $match = $match + 10;
                }
// check next preference

4) 从值为 0 的变量开始,如果偏好匹配 -> 变量 + 10%

问题是,我可以为所有成员执行此操作,但我如何才能选择前 10 名?我想我需要在 SQL 语句中执行此操作,但我不知道如何...

当然,这只是我的一个偏好和一个超级简单的代码版本,但你会明白的。有 15 种偏好设置。

// 编辑 //

我还想看看屏幕上的比赛评分有多少!

4

4 回答 4

1

好吧,从一开始这是一个很好的问题,所以我投了赞成票,然后浪费了大约 1 个小时来生成以下内容:)

数据

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

您可以在下面找到显示此表结构(3int列,1char(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(匹配值)
  • requiredQty - 需要的数量。如果记录的数量与之匹配,则结果将增加
  • requiredSex - 需要的性别值,如果记录的性别匹配,结果会增加

函数通过id表中的指定记录进行选择,将结果匹配值初始化为 0,然后将每个所需列与所需值进行比较。如果比较成功,则返回值增加 10。

现场测试

功能现场测试

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

干杯!

于 2013-07-11T14:33:31.157 回答
0

在查询中使用limitand :offset

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

这将给出最多的 10 个用户数据。

于 2013-07-11T12:22:57.940 回答
0

您可以像这样在查询中设置限制:

SELECT sex FROM ledenvoorkeuren WHERE userid <> yourid AND sex <> yourpreferredsex limit 0, 10

其中“0”是偏移量,“10”是您的限制

更多信息在这里

于 2013-07-11T12:26:15.893 回答
0

你可以试试这个

SELECT sex FROM ledenvoorkeuren WHERE userid = you limit 0, 10 order by YOUR_PREFERENCE
于 2013-07-11T12:26:47.990 回答