MySQL加入最大值

时间:2013-03-27 18:13:47

标签: mysql join

通过在entry.id上加入下面的表格,我想从food_brands表中提取具有最高type_id的行 - 所以我应该得到下面的前3行,使用type_id 11940

food_brands

        id      brand       type_id 
        15375   cesar       11940
        15374   brunos      11940
        15373   butchers    11940
        15372   bakers      11939
        15371   asda        11939
        15370   aldi        11939

类型

        id      type      quantity      food_id 
        11940   comm      53453         10497
        11939   comm      999           10496

食品

        id      frequency   entry_id 
        10497   twice       12230
        10496   twice       12230
        10495   once        12230

条目

         id     number  
         12230  26  

我对查询的尝试并没有过滤掉较低的type.id记录 - 所以从food_brands下面的表记录中,我得到的是type_id 11940和11939.感谢任何帮助解决这个问题!

SELECT fb.*
                        FROM food_brands fb
                        INNER JOIN types t ON fb.type_id = t.id
                        INNER JOIN
                        (
                            SELECT MAX(id) AS MaxID
                            FROM types
                            GROUP BY id
                        ) t2 ON t.food_id = t2.food_id AND t.id = t2.MaxID
                        INNER JOIN foods f ON t.food_id = f.id
                        INNER JOIN entries e ON f.entry_id = e.id
                        WHERE entries.id = 12230

3 个答案:

答案 0 :(得分:5)

一个简单的子查询应该做得很好;

SELECT * FROM food_brands WHERE type_id=
  (SELECT MAX(t.id) tid FROM types t
   JOIN foods f ON f.id=t.food_id AND f.entry_id=12230)

An SQLfiddle to test with

答案 1 :(得分:2)

如果您只想使用food_brands类型ID返回max的行,您应该可以使用:

SELECT fb.*
FROM food_brands fb
INNER JOIN
(
  select max(id) id
  from types
) t
  on fb.type_id = t.id

请参阅SQL Fiddle with Demo

答案 2 :(得分:0)

我不知道你为什么要在t2子查询之后执行所有这些内连接,因为你只检索fb的列,但我想你没有显示整个查询,你只想修复那个。

问题实际上在子查询t2中:由于某些无法解释的原因,您选择执行GROUP BY id更改MAX函数语义以生成每个{的最大值{1}},并且由于您要求该列的最大值,idMAX相互匹配。只需删除GROUP BY子句即可修复查询。

如果出于某些原因,您无法删除该条款,可能会将GROUP BY替换为MAX(id)并添加id

此外,您的子查询应该也可以选择ORDER BY id DESC LIMIT 1,因为它在随后的food_id子句中使用。