-2

私はあなたがこれを理解するのを手伝ってくれることを望んでいました. queryテーブルとそのすべての行を検索し、日付が現在の月と一致するa を実行したいと思います。を返しますuser_id。私が達成しようとしているのは、この下に上位 5 つのユーザー ID を収集することですquery

これを変更して、今月の上位 5 件を見つけるにはどうすればよいですか? 私は通常、クエリを理解することができますが、これには困惑しています。

現時点で持っているのはこれだけです。

$top = mysqli_query($mysqli, "SELECT sum(amount) AS total FROM sales WHERE status = 'S' AND MONTH(date) = 1");

    while($row = mysqli_fetch_row($top))
         {

           $userid = $row['0'];

         }

アップデート:

$top = mysqli_query($mysqli, "SELECT user_id
    FROM
    (
        SELECT user_id, SUM(amount) total 
        FROM sales 
        WHERE status = 'S' 
        AND MONTH(date) = MONTH(CURDATE())
        AND YEAR(date)  =  YEAR(CURDATE())
        GROUP BY user_id
    ) q
        ORDER BY total DESC
        LIMIT 5");

           while($row = mysqli_fetch_row($top))
                {
                   $topsales[] = $row['0'];
                }

    foreach($topsales as $topsale) {
            echo $topsale;
    }
4

1 に答える 1

2

このようなクエリをお探しですか?

SELECT user_id
  FROM
(
  SELECT user_id, SUM(amount) total 
    FROM sales 
   WHERE status = 'S' 
     AND MONTH(date) = MONTH(CURDATE())
     AND YEAR(date)  =  YEAR(CURDATE())
  GROUP BY user_id
) q
 ORDER BY total DESC
 LIMIT 5

あるいは単に

SELECT user_id 
  FROM sales 
 WHERE status = 'S' 
   AND MONTH(date) = MONTH(CURDATE())
   AND YEAR(date)  =  YEAR(CURDATE())
 GROUP BY user_id
 ORDER BY SUM(amount) DESC
 LIMIT 5

これがSLQFiddleのデモです

注: and関数を使用すると、MySql が列にある可能性のあるインデックスを使用できなくなりますMONTH()YEAR()date


PHPコードは次のようになります

$db  = new mysqli('localhost', 'user', 'password', 'dbname');
if ($db->connect_errno) {
    die('Cannot connect'); // TODO: better error handling
}
$sql = "SELECT user_id 
          FROM sales 
         WHERE status = 'S' 
           AND MONTH(date) = MONTH(CURDATE())
           AND YEAR(date)  =  YEAR(CURDATE())
         GROUP BY user_id
         ORDER BY SUM(amount) DESC
         LIMIT 5";

$topsales = array();

if ($query = $db->prepare($sql)) {
    $query->execute();
    $query->bind_result($user_id);

    while ($query->fetch()) {
        $topsales[] = $user_id;
    }
    $query->close();
} else {
    die('Unable to prepare: ' . $db->error); // TODO: better error handling
}
$db->close();

foreach ($topsales as $topsale) {
    echo $topsale . '<br>';
}
于 2013-07-04T04:39:23.903 に答える