1

次の行を持つ1つのテーブルを持つデータベースがあります:

id      name     date
-----------------------
1       Mike     2012-04-21
2       Mike     2012-04-25
3       Jack     2012-03-21
4       Jack     2012-02-12

Mike と Jack を一度だけ取得できるように、個別の値のみを抽出したいと考えています。検索スクリプトのコードは次のとおりです。

SELECT DISTINCT name FROM table WHERE name LIKE '%$string%' ORDER BY id DESC

しかし、うまくいきません。マイク、マイク、ジャック、ジャックを出力します。

なんで?

4

1 に答える 1

6

句があるためORDER BY id DESC、クエリは次のように記述されているかのように扱われます。

SELECT DISTINCT name, id
  FROM table
 ORDER BY id DESC;

ただし、id列はユーザ​​ー(あなた)に返されません。結果セットには、id注文できるようにするためのが含まれている必要があります。明らかに、この結果セットには4つの行があるため、これが返されます。(道徳:非表示の列で並べ替えないでください—クエリに対して何が行われるかを理解していない限り。)

試す:

SELECT DISTINCT name
  FROM table
 ORDER BY name;

(気まぐれによるDESCの有無にかかわらず)。これにより、2行だけが返されます。

id名前ごとにを知る必要がある場合は、次のことを考慮してください。

SELECT name, MIN(id)
  FROM table
 GROUP BY name
 ORDER BY MIN(id) DESC;

MAXを使用して同様に効果を上げることができます。

これはすべて、MySQLを含むすべてのSQLデータベースに適用されます。MySQLには、多少非決定的な結果をもたらすGROUPBY句を省略できるルールがいくつかあります。この機能を利用しないことをお勧めします。

長い間(おそらく今でも)、SQL標準では、このような混乱を避けるために、選択リストにない列で並べ替えることはできませんでした。結果セットに順序付けデータが含まれていない場合、結果セットの順序付けは「必須順序付け」と呼ばれます。順序付け列がすべて結果セットに表示される場合、データを自分で順序付けるのに十分なデータがあるため、「不必要な順序付け」です。

于 2012-04-26T16:43:43.423 に答える