2014-06-10 110 views
0

我有下面的表:MySQL的集團通過篩選爲了

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

提供的所有其他值沒有被分組是相同的,比這將工作。但是,如果任何字段(例如TblID)很重要,並且與所有其他記錄不同,則可能會得到不理想的結果。 – xQbert

+0

如果你正在尋找每個'IndividualID'獲得最小/最小的'TblID',那麼不,那不會做你想要的。 'ORDER BY'將在'GROUP BY'之後應用。 –

回答

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子句)。

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 

我明確定義了非聚合值的組bys。它可能會有更多的性能上的衝擊,但是當MySQL中啓用了分組的​​擴展(默認情況下)時,我的結果不太可能不正確。

在這種情況下,由於TreID和BrancID在where子句和你已經按IndividualID分組,它應該無關緊要......這意味着你不需要擁有TreeID,branchID,但是如果其中一個where子句條件後來被刪除,那就很重要。

這裏有一個選擇*這可能有點多,但它應該解決源於mySQLs擴展按功能分組的問題。

內部選擇獲取最小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 
+0

有沒有一種方法可以用'SELECT *'語句來做到這一點?或者我必須指定每一列(除了用於問題的還有更多)? – Eamonn

+0

@Eamonn如果你有更多的列,那麼除了你在問題中顯示的結果之外,你將不確定結果,這兩個用戶的回答對你的問題都是正確的,但如果你有其他的列是無效的,你會看到最小的'TblID'但其他列結果將以不確定的順序排列,這些不能保證您爲每個組提供第一行 –