0

私は 2 つの mysql クエリを持っています。1 つはすべての友達を取得するためのもので、もう 1 つは詳細と各友達のポイントの合計を取得するためのものです。

$get_my_friends_query = mysqli_query($GLOBALS['connect'], "SELECT friend_user_id FROM tbl_friend_link WHERE tbl_friend_link.your_user_id = 1");

while($get_my_friends_result = mysqli_fetch_assoc($get_my_friends_query))
{
   $get_friend_user_details_query = mysqli_query($GLOBALS['connect'], "SELECT tbl_registered_user.user_id, tbl_registered_user.first_name, tbl_registered_user.last_name,  tbl_registered_user.profile_name, SUM(tbl_point.amount) FROM tbl_registered_user JOIN tbl_point ON tbl_registered_user.user_id = tbl_point.user_id WHERE tbl_registered_user.status = 1 AND tbl_registered_user.user_id = '" . $get_my_friends_result['friend_user_id'] ."' GROUP BY tbl_registered_user.user_id ORDER BY SUM(tbl_point.amount)");
   $get_friend_user_details_result = mysqli_fetch_assoc($get_friend_user_details_query);

   $result = array(
      "done" => "true",
      "name" => $get_friend_user_details_result['first_name'] . " " . $get_friend_user_details_result['last_name'],
      "profile_name" => $get_friend_user_details_result['profile_name'],
      "userID" => $get_friend_user_details_result['user_id'],
      "points" => $get_friend_user_details_result['SUM(tbl_point.amount)'],
      "number_friends" => mysqli_num_rows($get_my_friends_query),
      "error_message" => ""
   );
   $row_array[] = $result;
}

echo json_encode($row_array);

ポイントがあるかどうかに関係なく結果を表示したいので、最初のクエリを使用しています。ポイントの SUM に基づいて結果を並べ替えたいのですが、その情報は 2 番目のクエリで取得されますが、$row_array で usort を使用する方法に関する適切な説明が見つかりませんでした。

4

3 に答える 3

1

私はそれを次のように動作させました:

function sorter($key){
    return function ($a, $b) use ($key) {
        return $a[$key] - $b[$key];
    };
}
usort($row_array, sorter('points'));
var_dump($row_array);
于 2013-07-11T10:33:31.470 に答える
0

「ポイントがあるかどうかに関係なく表示する」には、外部結合を調べる必要があります。Sams の 10 分で MySQL を独学する の例:

mysql>  SELECT c.name, o.order_date
    ->  FROM customers c
    ->  LEFT OUTER JOIN orders o
    ->  ON o.customer_code = c.customer_code
    ->  AND o.order_date BETWEEN '2006-02-01' AND '2006-02-28';
+-------------------------+------------+
| name                    | order_date |
+-------------------------+------------+
| Presidents Incorporated | NULL       |
| Science Corporation     | 2006-02-02 |
| Science Corporation     | 2006-02-05 |  
| Musicians of America    | 2006-02-01 |
| Musicians of America    | 2006-02-02 |
+-------------------------+------------+
5 rows in set (0.00 sec)

さらに、キーワードを使用して、ASクエリで直接必要な列に名前を付けます。.get_friend_user_details_result

単一のクエリで必要なものを正確に取得すると、速度が大幅に向上し、多くの場合、コードもかなりクリーンアップされます。

于 2013-07-11T11:09:53.443 に答える