列から一意の値を選択する


196

次のタイプの情報を含むMySQLテーブルがあります。

    Date            product 
2011-12-12           azd
2011-12-12           yxm
2011-12-10           sdx
2011-12-10           ssdd  

この表からデータを取得するために使用するスクリプトの例を次に示します。

<?php

$con = mysql_connect("localhost","username","password");
if (!$con)
  {
  die('Could not connect: ' . mysql_error());
  }
mysql_select_db("db", $con);
$sql=mysql_query("SELECT * FROM buy ORDER BY Date");
while($row = mysql_fetch_array($sql))
{

 echo "<li><a href='http://www.website/". $row['Date'].".html'>buy ". date("j, M Y", strtotime($row["Date"]))."</a></li>";

    }
    mysql_close($con);
?> 

このスクリプトは、テーブルのすべての日付を表示します。たとえば、

12.dec 2011
12.dec.2011
10.dec.2011
10.dec.2011

ユニークな日付のみを表示したい、例えば

12.dec.2011
10.dec.2011

回答:


362

MySQLでDISTINCT演算子を使用します

SELECT DISTINCT(Date) AS Date FROM buy ORDER BY Date DESC;

18
の残念な問題DISTINCTは、その1つのフィールドしか返さないことです...そのため、レコード全体が必要な場合、DISTINCTは無意味です(それがidフィールドでなく、idがそのリストにある場合、2番目のクエリを実行できます)。しかし、朗報ですが、JOINの結果として重複した結果が複数ある場合は、GROUP BYを実行して、完全な結果をフィルタリングできます。
Chadwick Meyer

1
チャドウィックマイヤーは正解ではありません。複数のフィールドを選択できますが、それらをグループ化する必要があります。このようにすることができます:SELECT DISTINCT(name)AS yourName、id AS yourId FROM table GROUP BY name ORDER BY name。あなたは驚かれることでしょう!
Lucian Minea

44

使用する

SELECT DISTINCT Date FROM buy ORDER BY Date

MySQLは重複を削除します

ところでSELECT、MySQLから大きな結果を得ている場合、PHP で明示的な列名を使用すると、使用するリソースが少なくなります


1
「明示的な列名の使用」について説明できますか?どちらの方法でリソースの使用量が少なく、どちらが高いですか。例を挙げてください。
Nabeel Khan 2016

一般的な使用例は、データベースのデータをPHPの多次元配列に「ストリーミング」することです。そのため、PHPプロセスは必要のないデータでメモリを浪費するだけです。一部のデータセットのみではこれは無視できますが、数千の行を処理する場合、違いが生じる可能性があります。
rabudde 2016年

2
SELECT * ...を使用する代わりに@NabeelKhan SELECT列1、列2を使用...すべての列が本当に必要でない限り。
LPChip 2017年

tablename.columnnameを使用した@LPChipは、columnnameだけよりも有益ですか?
Nabeel Khan、

1
@NabeelKhanは、テーブルを結合するときにtablename.columnnameのみが必要です。
LPChip 2017年

26

このクエリを使用して値を取得します

SELECT * FROM `buy` group by date order by date DESC

3
これは役に立たないことがわかりました。たとえば、同じであるdateが異なる5つのアイテムがあるとしdescriptionます。上記のコマンド使用すると、異なる表示されますが、最初に見つかったアイテムdateのみ表示descriptionされます。
onebree 2015

@onebree-その場合、実行できますGROUP BY date,description
ToolmakerSteve

20

残りはほぼ正しいですが、日付順に並べる必要があります

SELECT DISTINCT(Date) AS Date FROM buy ORDER BY Date DESC;

6

DISTINCT一意の値を取得するには、常に正しい選択です。また、使用せずに代わりに行うこともできます。それGROUP BYです。これは単にクエリの最後に追加され、その後に列名が続きます。

SELECT * FROM buy GROUP BY date,description

4

別のDISTINCT答えですが、複数の値があります:

SELECT DISTINCT `field1`, `field2`, `field3` FROM `some_table`  WHERE `some_field` > 5000 ORDER BY `some_field`

2

日付ごとの製品詳細もJSONとして出力する場合は、このようなものを使用します。

SELECT `date`,
CONCAT('{',GROUP_CONCAT('{\"id\": \"',`product_id`,'\",\"name\": \"',`product_name`,'\"}'),'}') as `productsJSON`
FROM `buy` group by `date` 
order by `date` DESC

 product_id product_name     date  
|    1     |     azd    | 2011-12-12 |
|    2     |     xyz    | 2011-12-12 |
|    3     |     ase    | 2011-12-11 |
|    4     |     azwed  | 2011-12-11 |
|    5     |     wed    | 2011-12-10 |
|    6     |     cvg    | 2011-12-10 |
|    7     |     cvig   | 2011-12-09 |

RESULT
       date                                productsJSON
2011-12-12T00:00:00Z    {{"id": "1","name": "azd"},{"id": "2","name": "xyz"}}
2011-12-11T00:00:00Z    {{"id": "3","name": "ase"},{"id": "4","name": "azwed"}}
2011-12-10T00:00:00Z    {{"id": "5","name": "wed"},{"id": "6","name": "cvg"}}
2011-12-09T00:00:00Z    {{"id": "7","name": "cvig"}}

SQL Fiddleで試してみてください



0

必要なものによって異なります。

この場合、私はお勧めします:

SELECT DISTINCT(Date) AS Date FROM buy ORDER BY Date DESC;

フィールドが少なく、の実行時間がDISTINCTの実行よりも短いためですGROUP BY

他の場合、たとえばフィールドが多い場合は、次のようにします。

SELECT * FROM buy GROUP BY date ORDER BY date DESC;
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.