SQL选择组

时间:2017-03-20 11:12:28

标签: mysql sql group-by phpmyadmin max

初始表是这样的:

Fruit  | Item_ID | Production_line | Amount_produced | Production_date 
---------------------------------------------------------------
Apples | 652     | 1               | 24              | 2016-05-12    
Pears  | 455     | 4               | 54              | 2016-05-16    
Pears  | 455     | 2               | 26              | 2016-05-13    
Apples | 652     | 6               | 65              | 2016-05-14  
Apples | 652     | 3               | 24              | 2016-05-21    
Pears  | 455     | 7               | 54              | 2016-05-17    
Pears  | 455     | 5               | 26              | 2016-05-15    
Apples | 652     | 8               | 65              | 2016-05-22    

我希望看到的结果是最高级别的生产线(因为它们根据它们所处的级别从1开始编号)按Item_ID和所有其他列分组:

Fruit  | Item_ID | Production_line | Amount_produced | Production_date 
---------------------------------------------------------------    
Pears  | 455     | 7               | 54              | 2016-05-17   
Apples | 652     | 8               | 65              | 2016-05-22

当我在查询结束时使用SELECT和MAX(Production_line)以及GROUP BY Item_ID来根据Item_ID对水果进行分组时,我没有得到正确的生产日期(不确定它是否随机抽取一个或多个)也没有产生正确的数量。

我在这张表中没有PRIMARY KEY。

我正在使用MySQL的phpMyAdmin工作。

4 个答案:

答案 0 :(得分:4)

有一个子查询,返回具有最高Production_line值的每个水果。结果为JOIN

select f1.*
from fruits f1
join (select fruit, max(Production_line) as maxProduction_line
      from fruits
      group by fruit) f2
    on f1.fruit = f2.fruit and f1.Production_line = f2.maxProduction_line

答案 1 :(得分:2)

您的表格中可能没有明确的主键,但我认为您希望记录包含每个FruitItem_ID组合的最新生产日期。如果是这样,那么我们可以将您的表连接到子查询,该子查询标识每个组的最新生产记录。

SELECT t1.*
FROM yourTable t1
INNER JOIN
(
    SELECT Fruit, Item_ID, MAX(Production_date) AS max_date
    FROM yourTable
    GROUP BY Fruit, Item_ID
) t2
    ON t1.Fruit = t2.Fruit AND
       t1.Item_ID = t2.Item_ID AND
       t1.Production_date = t2.max_date

答案 2 :(得分:1)

使用GROUP BY Cluase:

SELECT T1.*
FROM your_table T1
JOIN
(
  SELECT Fruit , Item_ID , MAX(Production_line) Production_line
  FROM your_table 
  GROUP BY Fruit , Item_ID
) A ON T1.Production_line = A.Production_line AND A.Item_ID = T1.Item_ID 

答案 3 :(得分:1)

SELECT MAX(Value)语法只是选择一个可以使用它的特定列;虽然我不确定你粘贴的是什么,但这将选择具有max production_line

的行
SELECT Fruit, Item_Id, max(Production_line) Amount_produced, Production_date FROM YourTable;

OR

SELECT Fruit, Item_Id, Production_line, Amount_produced, Production_date FROM YourTable WHERE Production_line = MAX(Production_line);