2017-01-05 3 views
1

私は以下のようにクエリを持っている:mysql内部結合を理解するには?

users = select * from users where group_id = 1 and track_id = "xxxxxx"; 
user_ids = [user.id for user in users] 
tickets = select * from tickets where group_id = 1 and user_id in (user_ids); 

usersticketsテーブルすべてがgroup_idフィールドを持っています。

ユーザインデックステーブルはgroup_idtrack_idフィールドにあります。 チケットのインデックステーブルはgroup_iduser_idフィールドにあります。

2つのSQLを1つにマージしたい。

select * from tickets join users on tickets.user_id = users.id 
where tickets.group_id = 1 and users.track_id = "xxxxx"; 

または

select * from tickets join users on tickets.user_id = users.id 
where users.group_id = 1 and users.track_id = "xxxxx";; 

それが正しいですか?それは良いですか?私は内部結合の意味はどういうのですか?tickets.group_idまたはusers.group_idを使うべきですか?違いはなんですか?

mysql inner joinを理解するには?どのように機能するのですか?

+0

ドキュメントから始めることができます。http://dev.mysql.com/doc/refman/5.7/en/join.html – Daerik

+0

@Siyualこれは内部対外部結合と何が関係がありますか? – Barmar

+0

@Barmarそうではありませんが、内側の結合がどのように機能するのかという疑問に答えています。 – Siyual

答えて

1

マージしているクエリと同じように、group_idのフィールドをテストする必要があります。

SELECT * 
FROM tickets AS t 
JOIN users AS u ON t.user_id = u.user_id 
WHERE t.group_id = 1 
AND u.group_id = 1 
+0

それは本当に彼が探しているものに依存します。ユーザーがどのグループに属していてもグループ1のすべてのチケットが必要な場合、 't.group_id = 1'が' where'で必要なのは唯一のものです。 – CptMisery

+0

@CptMiseryマージしたい元のクエリを見てください。彼は 'users.group_id = 1'を使ってユーザIDのリストを取得し、次に' tickets.group_id = 1'を使ってチケットを取得しました。同等の効果を得るには、彼は両方の結合をテストする必要があります。 – Barmar

+0

@Barmarあなたは正しいです! group_idとmysqlの両方で少ない行をスキャンすると、2つのテーブルすべてがインデックスを使用しています。 – pangpang

0

最初のクエリでグループ1のすべてのチケットが提供され、ユーザーはどのグループにも属します。 2番目のクエリは、チケットがグループ2の場合でもグループ1のユーザのすべてのチケットを提供します。

1

追加の結合基準を検討する:group_IDが常に両方のテーブルで同じになる場合は、またはでフィルタリングします。

SELECT * 
FROM tickets join users 
    on tickets.user_id = users.id 
and tickets.group_ID = users.group_ID 
WHERE tickets.group_id = 1 and users.track_id = "xxxxx"; 

また、group_IDがticket_IDと異なる可能性があるため、両方でフィルタする必要があります。

これは、2つのクエリの和集合を最も正確に表します。参加時にチケットとユーザーに対してgroup_IDが同じでない場合

SELECT * 
FROM tickets join users 
    on tickets.user_id = users.id 
WHERE tickets.group_id = 1 
    and users.group_id = 1 
    and users.track_id = "xxxxx"; 

論理的には、両方のテーブルの "GROUP_ID"の目的を理解する必要があります。それぞれの機能的な目的は何ですか?私はチケットのグループを売却することを想像することができます...しかし、私はどのようにユーザーがイベントに応じて静的なグループになる可能性が表示されません、ユーザーは時間の経過とともに複数のグループになる可能性があります。

両方のテーブルにgroup_IDを設定しないでください。おそらく、ユーザーグループテーブルが必要です。

2つのグループがエンティティの異なる基本属性を表す場合は、別々に評価する必要があります。したがって、2番目のクエリが最も理にかなっています。ただし、それらが同じエンティティ属性を表す場合は、結合条件に追加する方がより意味があります。

+0

素敵な答え!チケットテーブルでは、group_idは必要ないと思います。しかし、私はチケットからgroup_idを削除し、mysqlはすべてのチケット行をスキャンします。 – pangpang

+0

ユーザーgroup_idは、ユーザーがグループに属していることを表します。チケットのグループidの場合、グループユーザのチケットを取得するには、 'select * from ticket where group_id = 1;'ユーザとチケットだけを例にしてください。 – pangpang

+0

私はまだ両方の機能的な目的を理解していません。おそらくデータベースのデザインはちょっとですか?おそらく、ユーザーが今日のグループに所属している可能性があります。チケットを購入し、後で別のグループに所属してチケットを購入するため、各ユーザのチケットのgroup_ID値は、ユーザが購入した瞬間のグループIDを表します。ここでも、グループがどのように/なぜ使用されているかを知るための十分な機能情報がないため、2つの潜在的な結合の答えがありますどちらの場合も、GROUP_IDはGroupというテーブルのFKですか? – xQbert

関連する問題