67

質問が基本的すぎると思われる場合は、申し訳ありません。
完成したソリューションを求めてインターネット全体と StackOverflow を調べましたが、理解できるものは何も見つからず、自分で書くこともできないので、ここで質問する必要があります。

MySQL データベースがあります。
「posted」という名前のテーブルがあります。
8 つの列があります。

この結果を出力する必要があります:

SELECT DISTINCT link FROM posted WHERE ad='$key' ORDER BY day, month

しかし、「リンク」列だけでなく、この行の他の列も必要です。
このクエリで返されるすべての行と同様に、テーブル内の「ID」、「日」、「月」の値なども知る必要があります。

何を読めばいいのか、作り方を教えてください。
私は MySQL の専門家ではないので、できるだけ単純にしてください。

編集:私はこれを試しました:

SELECT DISTINCT link,id,day,month FROM posted WHERE ad='$key' ORDER BY day, month

うまくいきません。返される行が多すぎます。リンクが同じで、日/月/ID が異なる行が 10 行あるとします。このスクリプトは 10 個すべてを返しますが、最初の 1 つだけが必要です (このリンクの場合)。

4

13 に答える 13

101

DISTINCT問題は、それが列のローカル事前修飾子であると本能的に信じていることに起因します。

したがって、入力できる「はず」です

XXbadXX SELECT col1, DISTINCT col2 FROM mytable XXbadXX

col2 に対して一意の値を返すようにします。残念ながら、いいえ。 つまり、 (すべての回答を返す) とは対照的に、DISTINCT(すべての一意の回答を返す) です。したがって、単一のアクションは、指定したすべての列に作用します。 SELECTSELECT ALLSELECT DISTINCTDISTINCT

これによりDISTINCT、他の列を取得しながら、主要な非常に醜いバックフリップを行わずに、単一の列で使用することが非常に難しくなります。

正しい答えは、GROUP BY一意の回答が必要な列で a を使用することです。これにより、SELECT col1, col2 FROM mytable GROUP BY col2 任意の一意のcol2行とそのcol1データも得られます。

于 2012-11-29T02:20:32.773 に答える
10

私はこれを試しました:

SELECT DISTINCT link,id,day,month FROM posted
     WHERE ad='$key' ORDER BY day, month

うまくいきません。返される行が多すぎます。リンクが同じで、日/月/ID が異なる行が 10 行あるとします。このスクリプトは 10 個すべてを返しますが、最初の 1 つだけが必要です (このリンクの場合)。

あなたが求めていることは意味がありません。

のすべての個別の値が必要な場合、またはの最大でも 1 つの個別の値だけが必要な場合は、使用するlink, id, day, monthの値を選択する基準を見つける必要があります。id, day, monthlink

それ以外の場合は、非標準 SQL である/ステートメント内の MySQL の隠し列にGROUP BYHAVING似ており、実際には非常に混乱する可能性があります。

GROUP BY link実際、特定の値に対して任意の行を選択することが理にかなっている場合は、 a を使用できlinkます。

または、副選択を使用してid、各値の最小値を持つ行を選択することもできます (この回答linkで説明されているように)。

 SELECT link, id, day, month FROM posted
     WHERE (link, id) IN
           (SELECT link, MIN(id) FROM posted ad='$key' GROUP BY link)
于 2012-07-25T01:21:17.657 に答える
3

最善の解決策は、サブクエリを実行してから、それをテーブルに結合することだと思います。サブクエリは、テーブルの主キーを返します。以下に例を示します。

select *
from (
          SELECT row_number() over(partition by link order by day, month) row_id
          , *

          FROM posted 
          WHERE ad='$key' 
          ) x
where x.row_id = 1

これが行うことは、row_number 関数が、クエリの結果となる個別のリンクごとに分割された数値シーケンスを配置することです。

= 1 の row_numbers のみを取得すると、リンクごとに 1 行のみが返されます。

「1」とマークされるリンクを変更する方法は、row_number 関数の order-by 句を使用することです。

お役に立てれば。

于 2015-06-04T04:44:33.353 に答える
3

リンクが 1 つある行のみを表示する場合は、次を使用できます。

SELECT * FROM posted WHERE link NOT IN 
(SELECT link FROM posted GROUP BY link HAVING COUNT(LINK) > 1)

繰り返しますが、これは、重複したリンクを持つものをすべて切り取りたいと想定しています。

于 2012-07-25T02:46:52.650 に答える
2
  SELECT OTHER_COLUMNS FROM posted WHERE link in (
  SELECT DISTINCT link FROM posted WHERE ad='$key' )
  ORDER BY day, month
于 2012-07-25T00:56:15.753 に答える
1
SELECT DISTINCT link,id,day,month FROM posted WHERE ad='$key' ORDER BY day, month

また

SELECT link,id,day,month FROM posted WHERE ad='$key' ORDER BY day, month
于 2012-07-25T00:55:07.080 に答える
1

リンクが一意であるすべての列が必要な場合:

SELECT * FROM posted WHERE link in
     (SELECT link FROM posted WHERE ad='$key' GROUP BY link);
于 2012-07-25T01:10:17.740 に答える
-2

月の日付列を選択して、リンクごとに 1 つの行のみを取得できるようにします。

select link, min(datecolumn) from posted WHERE ad='$key' ORDER BY day, month

幸運を............

または

タイムスタンプとして日付列がある場合は、フォーマットを日付に変換し、リンクで個別に実行して、日時の代わりに日付に基づいて個別のリンク値を取得できるようにします

于 2014-04-04T04:59:00.393 に答える