2012-03-20 17 views
1

SQL照会を作成して、すべてのユーザー保留イベントを取得しようとしていますが、テーブルの構成方法が難しいです。次のようにSQLクエリの問題

私のテーブルは以下のとおりです。

​​

これまで、ユーザーがユーザーID、およびグループIDによって、すべてのグループによって識別されます。イベントには、ユーザーのリストを指すGroupIDが含まれています。

SELECT * FROM event 
WHERE event.group_id = (SELECT GroupID FROM Pending) 

しかし、どのように私は、特定のユーザーIDを持つユーザーのための唯一の保留中のイベントが返されるので、これをリンクする:私は、特定のユーザーのすべての保留中のイベントを取得する必要がありますか?これはinner joinを使用している書き込みに

select e.* from event e 
inner join pending p on 
e.group_id = p.GroupID 
where p.UserID = 123 

一般的な方法:

答えて

4
select e.* from event e 
inner join pending p on 
e.group_id = p.GroupID 
inner join Users u 
on p.UserID = u.UserID 
where u.UserID = 123 

実際にあなたがすでにユーザーIDを持っている場合、ユーザー・テーブルと結合スキップすることができます。従来は、サブ選択よりもパフォーマンスが優れていましたが、現代のDBMSでは、同じクエリに最適化されています。あなたが本当にサブで書きたい場合は、この

SELECT * FROM event 
WHERE event.group_id in (SELECT GroupID FROM Pending WHERE UserID = 123) 
+0

お返事ありがとう、特に私に教えてくれてどうもありがとうございました。 –

0
SELECT * FROM event E, 
       pending P, 
       Users U 
     WHERE E.group_id = P.GroupID 
      AND P.UserID = U.UserID 
      AND U.UserID = (Some XYZ id) 

のようなタイプを選択XYZは、いくつかの整数値でなければなりません。

1

は、あなたはあなたが試すことができ

SELECT u.username, 
     e.name 
FROM users u 
     INNER JOIN pending p 
     ON u.userid = p.userid 
     INNER JOIN event e 
     ON p.groupid = e.groupid 
WHERE 
    u.UserID = SomeID 
0

をフィルタリングするWHERE句を使用するのではなく、一緒にテーブルをリンクするJOIN句を使用したい:

select e.*, u.* from pending as p, users as u, event as e 
WHERE 
p.group_id = e.group_id 
AND p.user_id = u.userID 
1
SELECT 
    event.event_id 
FROM event 
    LEFT JOIN Pending ON event.group_id = Pending.GroupID 
    LEFT JOIN Users USING (UserID) 
WHERE Users.Username = 'foobar' 

USING()を利用することができるとき選択の両側にある列は同じ名前です。読みやすくするためです。これは、データベース全体で同じデータを同じ名前にすることをお勧めする主な理由の1つです。たとえば、Documentsテーブルと主キーdocument_idの場合、ドキュメントのIDを参照している他のすべてのテーブルでは、同じ名前が使用されます。

JOINについて詳しくは、mysqlまたはpostgresqlを参照してください。各参加者が何をするかを視覚的に表現するために:this article

また、ご希望のRDBMSについての書籍を入手して、すべての基本を学ぶ必要があります。SQL Antipatterns本を読んで知識を広げてください。または、書籍の作者が作成したslidesを慎重に見ることができます。