2011-07-06 3 views
2

Ok, donc il est plus facile de donner un exemple et nous espérons que certains a une solution:Utilisation de SQL pour obtenir des lignes distinctes, mais aussi toute la ligne pour les

Je table qui contient des offres:

ID | companyID | userID | contractID | bidAmount | dateAdded 

Voici un exemple ensemble de lignes qui pourraient être dans le tableau:

ID | companyID | userID | contractID | bidAmount | dateAdded 
-------------------------------------------------------------- 
10 | 2   | 1  | 94   | 1.50  | 1309933407 
9 | 2   | 1  | 95   | 1.99  | 1309933397 
8 | 2   | 1  | 96   | 1.99  | 1309933394 
11 | 103  | 1210 | 96   | 1.98  | 1309947237 
12 | 2   | 1  | 96   | 1.97  | 1309947252 

Ok, donc ce que je voudrais faire est d'être en mesure d'obtenir toutes les informations (comme en utilisant * dans une instruction select normale) offre la plus basse pour chaque uni que contractID.

donc je besoin des lignes suivantes:

ID = 10 (for contractID = 94) 
ID = 9 (for contractID - 95) 
ID = 12 (for contractID = 96) 

Je veux ignorer tous les autres. J'ai pensé à utiliser DISTINCT, mais je n'ai pas été capable de l'obtenir pour retourner toutes les colonnes, seulement la colonne que j'utilise pour distinct.

Quelqu'un a-t-il des suggestions?

Merci, Jeff

Répondre

6
select * 
from mytable main 
where bidAmount = (
    select min(bidAmount) 
    from mytable 
    where contractID = main.contractID) 

Notez que cela renvoie plusieurs lignes s'il y a plus d'un enregistrement partageant la même enchère minimum.

+0

Votre incroyable :) Merci beaucoup! – jefffan24

+0

Au lieu d'en faire une sous-requête corrélée, il suffit de faire un 'MIN (BidAmount) GROUP BY ContractID' – JNK

+0

Cela ne retournera pas les autres colonnes comme' userID' etc, n'est-ce pas? –

0

Vous pouvez utiliser un sous-requête pour trouver le plus bas rowid par contractid:

select * 
from YourTable 
where id in 
     (
     select min(id) 
     from YourTable 
     group by 
       ContractID 
     ) 
+0

Il veut avoir l'enchère la plus basse, pas l'ID le plus bas. –

+0

@Daniel Hilgarth: Droit, je vais voter pour la réponse de Bohème au lieu de mettre à jour celui-ci – Andomar

0

Le problème est que distinct ne renvoie pas une ligne spécifique - il renvoient des valeurs distinctes, qui (par définition) pourraient se produire sur plusieurs lignes

Les sous-requêtes sont votre réponse, et quelque part dans les suggestions ci-dessus est probablement la réponse. Votre sous-requête doit renvoyer les ID ou les lignes avec la valeur d'offre minimale. Ensuite, vous pouvez sélectionner * à partir des lignes avec ces identifiants.

1

n'a pas testé, mais il devrait être possible avec cette requête même si elle pourrait ne pas être très rapide:

SELECT * FROM bids WHERE ID IN (
    SELECT ID FROM bids GROUP BY contractID ORDER BY MIN(bidAmount) ASC 
) 

Ce serait la requête pour MySQL, peut-être que vous devez l'ajuster pour un autre db.

+0

TIL à propos de. Merci, il a répondu à ma question, mais vous avez raison est fou lent –

Questions connexes