3

私には手に負えないような課題があります。

+------+--------+-----------+-------+
|  id  |  user  |  genres   | books |
+------+--------+-----------+-------+
|  1   |  John  |  crimes   |   2   |
|  2   |  John  |  scienc   |   1   |
|  3   |  John  |  nature   |   4   |
|  4   |  Pete  |  nature   |   3   |
|  5   |  Pete  |  crime    |   2   |
|  6   |  Mary  | nature    |   20  |
+------+--------+-----------+-------+

ジャンルに関係なく、ユーザーが所有する本の総量を取得する SQL クエリが必要であり、誰が最も多く持っているかでそれらを並べ替えたいと考えています。

この例では、Mary は 20 冊、Pete は 5 冊、John は 7 冊の本を持っているので、望ましい結果は次のような配列になります。

result[0][user] = "Mary";
result[0][total] = 20;
result[1][user] = "John";
result[1][total] = 7;
result[2][user] = "Pete";
result[2][total] = 5;

これを1つのSQLにするにはどうすればよいですか? CONCATまたはTOPなどを使用する必要がありますか? 私はMySQLとPHPを使用しています。

4

3 に答える 3

6

SUM を使用した GROUP BY が必要です

SELECT `user`, SUM(books) AS total_books
FROM `table`
GROUP BY `user`
ORDER BY total_books DESC

最初の10個だけが必要な場合は、使用できます

SELECT `user`, SUM(books) AS total_books
FROM `table`
GROUP BY `user`
ORDER BY total_books DESC LIMIT 10`

ところで、スキーマを少し考え直す必要があるかもしれません。情報を複製することは、正規化の原則に反します。owners新しいテーブルを追加することができます:

  +-----------+-------------+
  | owner_id  |  owner_name |
  +-----------+-------------+
  |     1     |    John     |
  |     2     |    Pete     |
  |     3     |    Mary     |
  +-----------+-------------+

そしてowner_id、あなたのbooksテーブルでこれを参照してください。

于 2012-04-06T12:07:27.180 に答える
2
select user, sum(books) as total
from your_table
group by user
order by sum(books)
limit 10
于 2012-04-06T12:07:16.207 に答える
1
SELECT sum(books) as book_count, user  FROM `books` GROUP BY (user) order by book_count DESC
于 2012-04-06T12:18:39.970 に答える