1

必要なデータを取得するためにいくつかのテーブルを結合しましたが、SQL が初めてなので、データが複数回返されるのを止める方法がわかりません。

彼女は SQL ステートメントです。

SELECT
   T.url,
   T.ID,

   S.status,
   S.ID,

   E.action,
   E.ID,
   E.timestamp

FROM tracks T, status S, events E
WHERE S.ID AND T.ID = E.ID

ORDER BY E.timestamp DESC

返されるデータは次のようなものです。

+----------------------------------------------------------------+
| URL | ID | Status | ID | action               | ID | timestamp |
+----------------------------------------------------------------+
| T.1 | 4  | hello  | 4  | has uploaded a track | 4  | time      |
| T.2 | 3  | bye    | 3  | has some news        | 3  | time      |
| t.1 | 4  | more   | 4  | has some news        | 4  | time      |
+----------------------------------------------------------------+

これは非常に基本的な例ですが、何が起こるかを概説しています。3 行目を見ると、ステータスが異なる場合に URL が繰り返されています。

これが私が望んでいることです。

+-------------------------------------------------------+
| URL or Status | ID | action               | timestamp |
+-------------------------------------------------------+
| T.1           | 4  | has uploaded a track | time      |
| hello         | 3  | has some news        | time      |
| bye           | 4  | has some news        | time      |
+-------------------------------------------------------+

アクションがトラックをアップロードすると、URL (この場合はモックのものは T.1) が表示されることに注意してください。これはとても重要です。イベント テーブル内のアクションは、ステータスまたはトラック挿入のトリガーで挿入されます。新しいトラックが挿入された場合、アクションは「トラックをアップロードしました」であり、ステータスの意味を推測できます。この時点で、ID とタイムスタンプもイベント テーブルに挿入されます。

注:クエリに入るテーブルは他にもあり、実際には 3 つ以上ありますが、簡単にするために省略しています。

4

4 に答える 4

2

20 年前の構文は使用しないでください。多くの RDBMS はFROM a, b, cスタイル構文をサポートしていますが、私が使用したすべてのシステムでは非推奨になっています。 (すべてを扱ったわけではありませんが、このスタイルを使用しないことを強くお勧めします。)

代わりに、ANSI-92 標準JOIN構文を使用してください。それから物事を間違えるのははるかに難しいです...

SELECT
  *
FROM
  status S
INNER JOIN
  tracks T
    ON T.ID = S.ID
INNER JOIN
  events E
    ON E.ID = S.ID
ORDER BY
  E.timestamp DESC 

また、データの例は、表Sに次のものがあることを示唆しています...

 Status | ID
--------+----
 hello  | 4
 bye    | 3
 more   | 4

ID = 4には 2 つの行があります。T の各行を S の 1 つの行だけに結合したい場合は、どの行を選択する必要がありますか? 1 つを削除する必要がありますか、または 2 つのうちの 1 つを選択するために使用できる他のロジック/条件がありますか?

于 2012-08-31T15:31:41.090 に答える
0

groupbyを使用してみてください。

SELECT T1.url, T1.id, S1.estatus, S1.id, E1.action, E1.id, E1.timestamp FROM t T1, s S1, e E1 WHERE S1.id AND T1.id = E1.id GROUP BY S1.id ORDER BY E1.timestamp DESC;
于 2012-08-31T15:37:20.880 に答える
0

すべての回答をありがとう、彼らは大いに役立ちました。PHP の if ステートメントで機能するクエリを作成し、結果を操作しました。

ここにあります;

SELECT 
T.url AS track_url,

S.status,

E.action,
E.ID,
E.timestamp,

A.name,
A.url AS artist_url

FROM events E

LEFT JOIN 
TRACKS T
ON T.ID = E.ID AND E.action = 'has uploaded a track.'

LEFT JOIN  
STATUS S
ON S.ID = E.ID AND E.action = 'has some news.'

LEFT JOIN 
ARTISTS A
ON A.ID = E.ID

ORDER BY E.timestamp DESC

その結果、多くのNULL列が作成されますが、機能するので問題ありません。トラックIDがアップロードされていない場合は、関連する列がNULLあり、同じことがクエリの他の部分にも当てはまります。イベント テーブルの のみが選択されているためID、 は繰り返されません。ID

私が見落としているかもしれない問題を見つけたら、それについて叫んでください!

于 2012-08-31T16:45:25.873 に答える
0

これを変える

WHERE S.ID AND T.ID = E.ID

これに

WHERE S.ID = E.ID AND T.ID = E.ID

アップデート

暗黙の結合表記を使用することに非常に敏感な人がいます。これらの個人をなだめるために、より良い方法として、明示的なJOINステートメントを使用する必要があります。

于 2012-08-31T14:55:56.030 に答える