1

eaten次のように、食べた食品の履歴を含むテーブルがあります。

id | food | amount
1    1      50
2    1      60
3    1      60
4    1      70
5    2      10
6    2      1
7    2      900
8    2      1
9    2      1
10   3      3

amountそれぞれの最も一般的なものを選択する必要がありますfood。これは期待される結果です:

food | amount
1      60
2      1
3      3

動作するMySQLクエリは次のとおりですが、1つの食品に対してのみです:

SELECT `food`, `amount`, COUNT(`amount`) as `count`
FROM `eaten`
WHERE `food` = 1
GROUP BY `amount`
ORDER BY `count` DESC
LIMIT 1

何らかの理由で、WHEREパーツを消去すると、返される値が正しくありません。どうすればこれを修正できますか?

DB を再作成してテストするための SQL ファイルは次のとおりです。

4

3 に答える 3

2

試す:

select rq.food, rq.amount 
from (select food, amount, count(*) amcount
      from eaten
      group by food, amount) rq
join (select food, max(amcount) maxcount from
      (select food, amount, count(*) amcount
       from eaten
       group by food, amount) sq
      group by food) mq
on rq.food = mq.food and rq.amcount = mq.maxcount

SQLフィドル

于 2013-03-19T19:54:23.237 に答える
1

別の方法:

SELECT
    e.*
FROM
    ( SELECT DISTINCT food
      FROM eaten
    ) AS d
  JOIN
    ( SELECT DISTINCT food, amount
      FROM eaten
    ) AS e
      ON e.amount =
         ( SELECT amount
           FROM eaten AS ee
           WHERE ee.food = d.food
           GROUP BY amount
           ORDER BY COUNT(*) DESC
               LIMIT 1
         ) ;

SQL-Fiddleでテスト済み

于 2013-03-19T21:45:49.553 に答える
-1

これにより、各食品タイプで最も一般的な量が得られるはずです。副選択は、各食品と量の合計を示します。メインループでは、GROUP BY句により、クエリが食品タイプごとに1つのレコードのみを返すようになります。ORDER BYにより、最も一般的なものが使用されます。

SELECT `food`, `amount`, `count`

FROM

(
    SELECT `food`, `amount`, COUNT(`amount`) as `count`
    FROM `eaten`
    GROUP BY `food`, `amount`
    ORDER BY `food`, `count` DESC
) x

GROUP BY `food`
;
于 2013-03-19T19:49:36.210 に答える