2011-07-06 10 views
2

のために個別の行でなく、行全体を取得するためにSQLを使用し、うまくいけば、いくつかの解決策があります:その、簡単に例を与えるので、[OK]を、これらの

私は入札を保持するテーブルを持っている:

ID | companyID | userID | contractID | bidAmount | dateAdded 

以下の表の可能性があり、行のセットの例である:

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]をので、私は何をしたいこと(通常のSELECTステートメントで*使用してのように)すべての情報を取得できるようにすることです各ユニの最低入札価格que contractID。

だから私は、次の行が必要になります

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

私は他のすべてを無視したいです。私はDISTINCTの使用について考えましたが、私はすべての列を返すようにはできませんでした。

誰にも提案はありますか?

おかげで、同じ最小入札価格を共有する複数のレコードがある場合、これは複数の行を返すこと ジェフ

答えて

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

注意。

+0

あなたの驚異:)ありがとうございました! – jefffan24

+0

これを相関サブクエリにするのではなく、 'MIN(BidAmount)GROUP BY ContractID'を実行してください。 – JNK

+0

これは' userID'などの他のカラムを返さないでしょうか? –

0

あなたはContractIDのあたり最低ROWIDを見つけるために、サブクエリを使用することができます。

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

彼は最低のIDではなく、最低の入札を望んでいます。 –

+0

@Daniel Hilgarth:右、私はちょうどこの1つを更新するのではなく、ボヘミアンの答えに投票します – Andomar

0

問題は、異なるが、特定の行を返さないということである - それは(定義により)複数で発生する可能性が異なる値を返します行。

サブクエリがあなたの答えであり、上記の提案のどこかに答えがあると思われます。サブクエリは、最小の入札価格でIDまたは行を返す必要があります。これらのIDを持つ行から*を選択できます。

1

がそれをテストしていないが、それは本当に速いではないかもしれないが、それはこのクエリで可能でなければなりません:

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

これは、MySQLのクエリだろう、多分あなたは別のデシベルのためにそれを調整する必要があります。

+0

TILについてです。ありがとう、それは私の質問に答えましたが、あなたは正しいですか? –

関連する問題