1

私はそれが単純だと確信しているので、本当にこれを尋ねたくありませんでしたが:

郵便番号 (郵便番号) と生年月日のフィールドを含むユーザーのデータベースがあります。

訪問者は、年齢と自分の場所までの距離でユーザーを検索できます。これを行うには、すべてのユーザーを選択し、年齢を計算し、距離を計算する必要があります。次のようになります。

$result = queryMysql("SELECT user FROM table WHERE user !='$user' ORDER BY joindate DESC ");
$num = mysql_num_rows($result);

for ($j = 0 ; $j < $num ; ++$j)
{
$row = mysql_fetch_row($result);
if ($row[0] == $user) continue;

$query = "SELECT * FROM table WHERE user='$row[0]'";
$res=mysql_query($query);
$users=mysql_fetch_assoc($res);

//Get Date of Birth and Calculate Age
$dob = $users['age'];
$age = ...

//Get Profile's Postcode and Calculate Distance 
$profilepc = $views['postcode'];
$distance = ...

if(($distance <200) AND ($age >18 AND <30)) {

}

これまでのところ、問題ありません。ただし、訪問者によって設定された年齢と距離のパラメーター内に収まるユーザーのみを選択する別のクエリ (ページネーション用) を実行したい場合は、上記の IF ステートメントでエコーできますが、に含める方法がわかりません新しいクエリ。

では、最初のクエリの結果を何か (配列?) に配置し、その最初のクエリの user_id (一意) を使用して、ページネーションに必要なユーザーのみを選択するにはどうすればよいですか? 何かのようなもの:

SELECT * FROM $table WHERE user_id=(filtered user_id's) ORDER BY joindate DESC 

それが理にかなっていることを願っています。ありがとう

4

3 に答える 3

5

INの代わりに使用=

SELECT * FROM $table
WHERE user_id IN (select user_id from other_table where some_condition) 
ORDER BY joindate DESC 
于 2012-10-31T20:27:27.257 に答える
1

IN句にサブクエリを使用できます。または、すでにIDのPHP配列がある場合は次のようになります。

// assuming your array of IDs is
$user_ids = array(1, 2, 3, 4);

// use implode() to create a comma separated list for use in your IN clause
$query = "SELECT * FROM {$table}
WHERE user_id IN (" . implode(',', $user_ids) . ") 
ORDER BY joindate DESC;"
于 2012-10-31T20:32:01.387 に答える
1

SQL で何かを実行できる場合は、ほとんどの場合、それが最善かつ最速のオプションです。次のクエリは、年齢 (年数) が 30 歳を超えるユーザーを除くすべてのユーザーを選択します。

あなたのデータがわからないため、距離の計算方法がわからないため、距離のSQLを書くことができませんでした。ただし、追加できる場所をいくつか追加しました。

"limit" 句は、データベース内の 10 から 20 までのレコードを取得します。

   SELECT 
       * 
    FROM 
       table
    WHERE 
       user != $user
       and (
           (year(now()) - year(table.birthday))  > 30
           or (some match to calculate distance)
        )
    limit 10, 20

別のテーブルからさらにデータが必要な場合は、このように結合できます。

   SELECT 
       * 
    FROM 
       table
       another_table
    WHERE 
       another_table.user = table.user
       table.user != $user
       and (
           (year(now()) - year(table.birthday))  > 30
           or (some match to calculate distance)
        )
    limit 10, 20

データベースでの選択に比べて、任意の言語で複数の選択とループのデータを作成するのは遅くなります。

于 2012-10-31T21:06:10.830 に答える