2011-08-17 3 views
2

私のSQLテーブルには、次の1つのカラムに重複したエントリがある場合に、結果の行が1つしか返されないように、SQLクエリやPHP関数をどのように記述すればよいですか?

╔══════════╦═════════════════╦═════════╦════════════╦═══════╗ 
║ username ║ expiration_date ║ item_id ║ item_price ║ cents ║ 
╠══════════╬═════════════════╬═════════╬════════════╬═══════╣ 
║ joe  ║  1313446093 ║  10 ║   0 ║  1 ║ 
║ james ║  1324242242 ║  11 ║   0 ║  1 ║ 
║ Sarah ║  1324552599 ║  10 ║   0 ║  1 ║ 
╚══════════╩═════════════════╩═════════╩════════════╩═══════╝ 

と私は私のSQLクエリのために、これまで持っている変数$ SQLは

SELECT expiration_date, item_price 
FROM list 
WHERE expiration_date > '$current_time' 

と、上記の例のテーブルから、私は2つの結果になるだろうを受けているようなものですitem_id = 10のために戻ってください。しかし、私は最新のもの、この場合サラの列を受け取りたいだけです。各クエリーの実行中に同じitem_id型の最新のものだけが返されるようにするにはどうすればよいですか。

+0

DUP [列の最大値を持つ行を取得] (http://stackoverflow.com/questions/121387/fetch-the-row-which-has-the-max-value-for-a-column)、[MAX(列値)、DISTINCT SQLの別の列で?](http://stackoverflow.com/questions/612231/how-can-i-sel (SQL:グループごとに最大レコードを見つける)(http://stackoverflow.com/questions/2657482/sql-find-グループあたりの最大レコード数)、 – outis

+0

... [SQL MAX関数を使用して行のすべてのフィールドを取得する方法は?](http://stackoverflow.com/questions/2893903/how-to-get -all-the-a-row-using-the-sql-max-function)、[MySQL:MAXとGROUP BYを使って対応するすべてのフィールドを選択する](http://stackoverflow.com/questions/1305056/ mysql-select-all-corresponding-fields-using-max-and-group-by) – outis

答えて

3
$sql = " 
SELECT expiration_date, item_price 
FROM list 
WHERE expiration_date > '$current_time' 
ORDER BY expiration_date DESC 
LIMIT 1 
"; 

最新のものが最初に返された状態で並べ替え、1つの結果に制限します。私が問題を適切に理解していれば、これは魅力的に機能するはずです。

2

これを試してみてください。

SELECT * 
FROM list L 
INNER JOIN (
     SELECT MAX(expiration_date) as expiration_date, item_id 
     FROM list 
     GROUP BY item_id 
     ) M 
ON L.item_id = M.item_id and L.expiration_date = M.expiration_date 
+0

「MAX」はこのトリックを行うべきです。私はそれがパフォーマンスの面で「オーダー・バイ・プラス」と「リミット1」をどのように比較するのか不思議です。 –

+1

集計されたサブクエリよりも、ソートはほぼ確実に高速です。 'SELECT * RFOM list WHERE item_id = 10 ORDER BY expiration_date DESC LIMIT 1'すべてのitem_idsの最新の行を取得する場合は、上記はおそらくmySQLの中で最良の選択です –

2

は、クエリの最後にORDER BYLIMITを追加:の

SELECT expiration_date, item_price 
FROM list 
WHERE expiration_date > '$current_time' 
ORDER BY expiration_date DESC 
LIMIT 1; 
0
$sql = " 
select item_price, MAX(expiration_date) 
from list 
where expiration_date > '$current_time' 
group by item_id"; 
関連する問題