我有一个包含以下列的表:
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排序吗?
答案 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子句)。