2

ユーザーは、自分の好みを入力して、他のユーザーを見つけることができます。その入力に基づいて、好みに最もよく一致するトップ 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);

3) select ステートメント 1 と select ステートメント 2 を一致させる

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

4) 好みが一致する場合は、値 0 の変数から開始します -> 変数 + 10%

問題は、すべてのメンバーに対してこれを行うことができることですが、どうすればトップ 10 を選択できますか? SQLステートメントでこれを行う必要があると思いますが、方法がわかりません...

もちろん、これは 1 つの設定であり、私のコードの非常に単純なバージョンですが、アイデアは理解できるでしょう。15の設定があります。

// 編集 //

また、試合のレーティングが画面上でどのくらい表示されるかを確認したいと思います!

4

4 に答える 4

1

まあ、それは最初から良い質問だったので、私はそれに賛成票を投じ、それから約1時間を無駄にして以下を作成しました:)

データ

ここでは、実験用に名前が付けられた DB と名前が付けられたtestテーブルを使用しました。t

int以下に、このテーブルの構造 (3列、1char(1)列) と完全なデータを示すスクリーンショットを示します。

データを含むソース テーブル

ご覧のとおり、すべてがかなり単純ですid。主キーとして機能する 4 つの列と、いくつかのレコード (行) があります。

私たちが達成したいこと

いくつかの列の値を必要なパラメーターと比較することを含む、いくつかの複雑な基準に基づいて、このテーブルから限られた一連の行を選択できるようにしたいと考えています。

解決

このための関数を作成することにしました。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 ;

マイナーな説明

関数は、特定の 1 つのレコードが指定されたパラメーターのセットにどの程度一致するかを計算intし、結果として値を返します。値が大きいほど一致度が高くなります。

関数は 3 つのパラメーターを受け入れます。

  • recordId - 結果を計算する必要があるレコードの ID (一致値)
  • neededQty - 必要な数量。レコードの数量が一致する場合、結果は増加します
  • neededSex - 必要な性別の値。レコードの性別が一致する場合、結果が増加します

関数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 に答える