MySQL Group按顺序筛选结果

时间:2014-06-10 19:18:31

标签: mysql sql

我有一个包含以下列的表:

TblID - AUTO_INCREMENT
IndividualID
BranchID
TreeID

只有TblID是唯一的。我希望查询TreeID = x和BranchID = y的表,以检索共享这些特征的所有单个记录。一个IndividualID可能有很多个人记录,但我只想检索每个IndividualID创建的第一个(因此具有最低的TblID值)。

所以我改变了:

SELECT * FROM tbl WHERE TreeID = :TreeID AND BranchID= :BranchID

SELECT * FROM `rep_options` WHERE TreeID = :TreeID AND BranchID= :BranchID
    GROUP BY IndividualID ORDER BY TblID ASC

这似乎有效,但我对MySQL群组感到不舒服,无法确信我是通过正确的方式找到正确的方法。

这是将每个IndividualID只返回一条记录的正确方法,按TblID排序吗?

2 个答案:

答案 0 :(得分:1)

SELECT MIN(TblID) AS TblID, IndividualID, TreeID, BranchID
FROM `rep_options` 
WHERE TreeID = :TreeID AND BranchID= :BranchID
GROUP BY IndividualID, TreeId, BranchID
ORDER BY TblID ASC

我为非聚合值明确定义了group bys。它可能会有更多的性能损失,但是当我在MySQL中启用了Group by扩展时,我的结果不太可能是错误的(默认情况下是这样)

在这种情况下,因为TreID和BrancID在where子句中,并且您已经按IndividualID进行分组,所以它不应该......这意味着您不需要拥有TreeID,branchID,但是如果其中之一后来删除了where子句标准,这很重要。

这里有一个选择*这可能有点多了,但它应该解决源自mySQLs扩展Group by功能的问题。

内部选择获取最小ID和个人。这样,扩展群组不再成为问题。

SELECT *
FROM `rep_options` a
INNER JOIN 
 (Select min(tblID) myID,  IndividualID
  FROM `rep_options` 
  WHERE TreeID = :TreeID AND BranchID= :BranchID
  group by IndividualID) b
  on a.Myid=a.tblID 
 and B.IndividualID = A.IndividualID
ORDER BY TblID ASC

答案 1 :(得分:0)

如果您需要最低TblID值,请使用MIN函数,如下所示:

SELECT MIN(TblID) AS TblID, IndividualID, TreeID, BranchID
FROM `rep_options` 
WHERE TreeID = :TreeID AND BranchID= :BranchID
GROUP BY IndividualID 
ORDER BY TblID ASC

理想情况下,GROUP BY子句应包含SELECT子句中提到的所有非聚合列,但在这种情况下无关紧要,因为所有行都具有相同的TreeID和BranchID值(由于WHERE子句)。