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我需要为每个SELECT 最常见的food。这是预期的结果:

food | amount
1      60
2      1
3      3

这是我的 MySQL 查询,但仅适用于一种食物:

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

出于某种原因,当我擦除WHERE零件时,返回的值不正确。我怎样才能解决这个问题?

这是重新创建数据库以对其进行测试的 SQL 文件:eated.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 子句将确保查询只返回每种食物类型的一条记录。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 回答