2017-11-28 2 views
1

Bisher habe ich das.mehrere Joins auf gleichen Tabellen

SELECT p1.player_id, p1.real_name, p2.player_id, p2.real_name, 
    ->  m.scoreA, m.scoreB 
    -> FROM matches m 
    -> JOIN players p1 ON p1.player_id = m.playerA 
    -> JOIN players p2 ON p2.player_id = m.playerB; 
+-----------+------------------------------------+-----------+------------------------------------+--------+--------+ 
| player_id | real_name       | player_id | real_name       | scoreA | scoreB | 
+-----------+------------------------------------+-----------+------------------------------------+--------+--------+ 
|  19 | Seong Hun Choi      |   1 | Dong Nyoung Lee     |  0 |  2 | 
|  38 | Yun Sik Choi      |   1 | Dong Nyoung Lee     |  0 |  2 | 
|  160 | Lei Wang       |   1 | Dong Nyoung Lee     |  0 |  2 | 
|   3 | Seung Hyun Lee      |   1 | Dong Nyoung Lee     |  0 |  2 | 
|  45 | Min Chul Kim      |   1 | Dong Nyoung Lee     |  0 |  2 | 
|  23 | Sasha Hostyn      |   1 | Dong Nyoung Lee     |  2 |  4 | 
|  52 | Juan Moreno Duran     |   1 | Dong Nyoung Lee     |  2 |  3 | 
|  18 | Kang Dong Hyun      |   1 | Dong Nyoung Lee     |  2 |  1 | 
|  22 | Jae Duck Lim      |   1 | Dong Nyoung Lee     |  1 |  2 | 
|  108 | Jérémy Vansnick     |   1 | Dong Nyoung Lee     |  1 |  2 | 

Ich möchte ein paar mehr Spalten von meinem members Tisch setzen, ohne table die Größe meiner Matches zu ändern. Alles, was ich versuche, scheint die Größe meiner Treffertabelle zu ändern. Es geht von 46k auf über 1 Million. Das habe ich bisher versucht.

Ich dachte, vielleicht habe ich den gleichen Teil falsch eingestellt, also habe ich das versucht.

SELECT p1.player_id, p1.real_name, p2.player_id, p2.real_name, 
    m.scoreA, m.scoreB, mem1.player, mem2.player 
FROM matches m 
JOIN players p1 ON p1.player_id = m.playerA 
JOIN members mem1 ON mem1.player = m.playerA 
JOIN players p2 ON p2.player_id = m.playerB 
JOIN members mem2 ON mem2.player = m.playerB; 

Ich möchte es so aussehen, wenn es fertig ist.

+-----------+------------------------------------+-----------+------------------------------------+--------+--------+ 
| player_id | real_name       | player_id | real_name       | scoreA | scoreB | member1  member2 
+-----------+------------------------------------+-----------+------------------------------------+--------+--------+ 
|  19 | Seong Hun Choi      |   1 | Dong Nyoung Lee     |  0 |  2 | 
|  38 | Yun Sik Choi      |   1 | Dong Nyoung Lee     |  0 |  2 | 
|  160 | Lei Wang       |   1 | Dong Nyoung Lee     |  0 |  2 | 
|   3 | Seung Hyun Lee      |   1 | Dong Nyoung Lee     |  0 |  2 | 
|  45 | Min Chul Kim      |   1 | Dong Nyoung Lee     |  0 |  2 | 
|  23 | Sasha Hostyn      |   1 | Dong Nyoung Lee     |  2 |  4 | 
|  52 | Juan Moreno Duran     |   1 | Dong Nyoung Lee     |  2 |  3 | 
|  18 | Kang Dong Hyun      |   1 | Dong Nyoung Lee     |  2 |  1 | 
|  22 | Jae Duck Lim      |   1 | Dong Nyoung Lee     |  1 |  2 | 
|  108 | Jérémy Vansnick     |   1 | Dong Nyoung Lee     |  1 |  2 | 
|  53 | Igor Turchin      |   1 | Dong Nyoung Lee     |  1 |  2 | 
|  17 | Hyun Woo Park      |   1 | Dong Nyoung Lee     |  0 |  2 | 

Ich brauche diesen Prozess auch mit zwei weiteren Tabellen zu wiederholen, so hilft mir das Verfahren von zu verstehen, wie dies zu tun wäre sehr geschätzt.


Übereinstimmungsliste.

+----------+------------+------------+---------+---------+--------+--------+---------+ 
| match_id | date  | tournament | playerA | playerB | scoreA | scoreB | offline | 
+----------+------------+------------+---------+---------+--------+--------+---------+ 
|  1 | 2012-12-04 |  799 |  4 |  55 |  1 |  3 |  0 | 
|  2 | 2012-12-03 |  11921 |  2 |  41 |  2 |  0 |  0 | 
|  3 | 2012-12-03 |  11921 |  21 |  41 |  0 |  2 |  0 | 
|  4 | 2012-12-03 |  11921 |  3 |  2 |  2 |  1 |  0 | 
|  5 | 2012-12-03 |  11921 |  41 |  2 |  1 |  2 |  0 | 
|  6 | 2012-12-03 |  11921 |  21 |  3 |  1 |  2 |  0 | 
|  7 | 2012-12-03 |  11924 |  1 |  8 |  2 |  1 |  1 | 
|  8 | 2012-12-03 |  11924 |  1 |  8 |  2 |  3 |  1 | 
|  9 | 2012-12-03 |  11924 |  8 |  19 |  3 |  2 |  1 | 
|  10 | 2012-12-03 |  11924 |  19 |  12 |  2 |  1 |  1 | 
+----------+------------+------------+---------+---------+--------+--------+---------+ 

Spieler Tabelle

+-----------+-----------+-----------------+-------------+------------+-----------+ 
| player_id | tag  | real_name  | nationality | birthday | game_race | 
+-----------+-----------+-----------------+-------------+------------+-----------+ 
|   1 | Leenock | Dong Nyoung Lee | KR   | 1995-04-01 | Z   | 
|   2 | Creator | Hyun Woo Jang | KR   | 1996-08-19 | P   | 
|   3 | Life  | Seung Hyun Lee | KR   | 1997-01-11 | Z   | 
|   4 | DongRaeGu | Soo Ho Park  | KR   | 1991-06-03 | Z   | 
|   5 | PartinG | Lee Sak Won  | KR   | 1994-08-24 | P   | 
|   6 | TaeJa  | Young Suh Yoon | KR   | 1995-01-01 | T   | 
|   7 | Rain  | Yoon Jong Jung | KR   | 1992-08-14 | P   | 
|   8 | viOLet | Dong Hwan Kim | KR   | 1990-12-05 | Z   | 
|   9 | Sniper | Tae Hoon Kwon | KR   | 1995-01-22 | Z   | 
|  10 | Stephano | Ilyes Satouri | FR   | 1993-03-12 | Z   | 
+-----------+-----------+-----------------+-------------+------------+-----------+ 

Mitglieder Tisch

+--------+------+------------+------------+ 
| player | team | start_date | end_date | 
+--------+------+------------+------------+ 
|  1 | 88 | 2011-02-23 | 2011-07-18 | 
|  1 | 4 | 2011-07-18 | NULL  | 
|  2 | 3 | 2011-01-12 | NULL  | 
|  3 | 65 | 2010-10-19 | 2012-07-13 | 
|  3 | 1 | 2012-07-13 | NULL  | 
|  4 | 7 | 2011-02-20 | NULL  | 
|  5 | 88 | 2010-10-29 | 2011-07-18 | 
|  5 | 1 | 2012-10-21 | 2013-01-03 | 
|  5 | 12 | 2013-01-14 | NULL  | 
|  6 | 65 | 2011-03-01 | 2011-05-01 | 
+--------+------+------------+------------+ 
+0

Können Sie das Schema hier schreiben? – MASh

+0

Zeigen Sie nicht die Ergebnisse von Abfragen mit mehreren Tabellen an, sondern zeigen Sie uns einige Daten aus jeder Tabelle an. einschließlich der DDL jeder Tabelle würde auch helfen. –

+0

Ist das was du meinst? 'player_id | echter_name | Spieler_ID | echter_name | scoreA | scoreB | member1 member2' Es tut mir leid, ich weiß nicht, was Sie mit dem Schema meinen. – noobprogrammer1987

Antwort

1

Es sieht aus wie die Abfrage eine semi-cartesianischen Produkt erzeugt.

player Spalte ist nicht einzigartig in der member Tabelle. Es sieht aus wie ein player ist ein member von nur einem Team zu einer Zeit, basierend auf der start_date und end_date.

Wir wollen wahrscheinlich einen Vergleich der date aus der match Tabelle zum start_date und end_date in member Tabelle aufzunehmen. Vielleicht möchten wir es auch zu einem äußeren Join machen.

LEFT 
JOIN `member` mem2 
    ON mem2.player  = m.playerB 
AND mem2.start_date <= m.date 
AND (mem2.end_date > m.date OR mem2.end_date IS NULL) 

Beachten Sie, dass eine des Datumsvergleiches enthält eine Gleichheit, macht die andere Seite nicht (weil die start_date auf Zeile erscheint die end_date auf einer anderen Zeile in member, für das gleiche für die gleichen player gleich zu sein .

(Für ein Spiel date='2011-07-18', das Team player=1 Mitglied war?)

Wir wollen auch den NULL Wert in end_date, in diesem Fall zu handhaben, dass ein lar darstellen, die ge Wert, der größer ist als der matchdate.

Wir wollen das gleiche Muster für mem1 auch verwenden.

+0

Wie kann ich diese Probleme besser finden? Ich habe den größten Teil des Tages damit gestarrt und konnte es nicht herausfinden. Ich dachte, ich könnte das Datum Problem nach dem Einrichten meiner Joins beheben. – noobprogrammer1987

+1

Wenn ich Abfragen wie diese erstelle, lege ich die PRIMARY- oder UNIQUE-Schlüsselspalten jeder Tabelle am Anfang der Auswahlliste an und sortiere nach denselben Primärschlüsselspalten. Der Schlüssel zur Vermeidung von Duplikaten ist das Identifizieren der garantierten Kardinalität der Beziehungen ... Ich muss wissen, ob es garantiert eins zu eins ist oder eins zu null oder eins oder eins zu null Eins oder viele oder viel zu viel. – spencer7593

1

Es gibt ein anfängliches Problem bei der Erstellung der Match-Tabelle. Berücksichtigen Sie Folgendes, indem Sie jeden Spieler "umdrehen" und in eine eigene Reihe bringen.Nun ist die Anzahl der nachfolgenden wird Joins sofort halbiert:

select 
     piv, match_id, date, tournament, offline 
     , case when piv = 1 then playerA 
      else playerB 
     end as Player_id 
     , case when piv = 1 then scoreA 
      else scoreB 
     end as Score 
    from matches 
    cross join (select 1 as piv union all select 2) cj 

10 Zeilen in der Spiele Tabelle wird 20 Zeilen aus dieser Abfrage:

| piv | match_id |     date | tournament | offline | Player_id | Score | 
|-----|----------|----------------------|------------|---------|-----------|-------| 
| 1 |  1 | 2012-12-04T00:00:00Z |  799 |  0 |   4 |  1 | 
| 2 |  1 | 2012-12-04T00:00:00Z |  799 |  0 |  55 |  3 | 
| 1 |  2 | 2012-12-03T00:00:00Z |  11921 |  0 |   2 |  2 | 
| 2 |  2 | 2012-12-03T00:00:00Z |  11921 |  0 |  41 |  0 | 
| 1 |  3 | 2012-12-03T00:00:00Z |  11921 |  0 |  21 |  0 | 
| 2 |  3 | 2012-12-03T00:00:00Z |  11921 |  0 |  41 |  2 | 
| 1 |  4 | 2012-12-03T00:00:00Z |  11921 |  0 |   3 |  2 | 
| 2 |  4 | 2012-12-03T00:00:00Z |  11921 |  0 |   2 |  1 | 
| 1 |  5 | 2012-12-03T00:00:00Z |  11921 |  0 |  41 |  1 | 
| 2 |  5 | 2012-12-03T00:00:00Z |  11921 |  0 |   2 |  2 | 
| 1 |  6 | 2012-12-03T00:00:00Z |  11921 |  0 |  21 |  1 | 
| 2 |  6 | 2012-12-03T00:00:00Z |  11921 |  0 |   3 |  2 | 
| 1 |  7 | 2012-12-03T00:00:00Z |  11924 |  1 |   1 |  2 | 
| 2 |  7 | 2012-12-03T00:00:00Z |  11924 |  1 |   8 |  1 | 
| 1 |  8 | 2012-12-03T00:00:00Z |  11924 |  1 |   1 |  2 | 
| 2 |  8 | 2012-12-03T00:00:00Z |  11924 |  1 |   8 |  3 | 
| 1 |  9 | 2012-12-03T00:00:00Z |  11924 |  1 |   8 |  3 | 
| 2 |  9 | 2012-12-03T00:00:00Z |  11924 |  1 |  19 |  2 | 
| 1 |  10 | 2012-12-03T00:00:00Z |  11924 |  1 |  19 |  2 | 
| 2 |  10 | 2012-12-03T00:00:00Z |  11924 |  1 |  12 |  1 | 

Also, mit, dass als Ausgangspunkt für die Spieler Daten der Verbindungs Das ist einfach, und obwohl es auch für die Mitglieder-Tabelle einfach ist, wollen wir sicherstellen, dass wir nur ihre "aktuelle" Zeile aus dieser Tabelle bekommen, also setzen wir das heutige Datum zwischen den Start-/Enddaten jedes Teams (heutiges Datum) wird verwendet, wenn das Enddatum NULL ist).

select 
* 
from (
     select 
      piv, match_id, date, tournament, offline 
      , case when piv = 1 then playerA 
       else playerB 
      end as Player_id 
      , case when piv = 1 then scoreA 
       else scoreB 
      end as Score 
     from matches 
     cross join (select 1 as piv union all select 2) cj 
    ) g 
left join Players p on g.Player_id = p.Player_id 
left join Members m on g.Player_id = m.player 
        and curdate() between m.start_date and coalesce(m.end_date,curdate()) 

Dies erzeugt keine weitere Steigerung in den 20 Zeilen:

| piv | match_id |     date | tournament | offline | Player_id | Score | player_id |  tag |  real_name | nationality |    birthday | game_race | player | team |   start_date | end_date | 
|-----|----------|----------------------|------------|---------|-----------|-------|-----------|-----------|-----------------|-------------|----------------------|-----------|--------|--------|----------------------|----------| 
| 1 |  7 | 2012-12-03T00:00:00Z |  11924 |  1 |   1 |  2 |   1 | Leenock | Dong Nyoung Lee |   KR | 1995-04-01T00:00:00Z |   Z |  1 |  4 | 2011-07-18T00:00:00Z | (null) | 
| 1 |  8 | 2012-12-03T00:00:00Z |  11924 |  1 |   1 |  2 |   1 | Leenock | Dong Nyoung Lee |   KR | 1995-04-01T00:00:00Z |   Z |  1 |  4 | 2011-07-18T00:00:00Z | (null) | 
| 1 |  2 | 2012-12-03T00:00:00Z |  11921 |  0 |   2 |  2 |   2 | Creator | Hyun Woo Jang |   KR | 1996-08-19T00:00:00Z |   P |  2 |  3 | 2011-01-12T00:00:00Z | (null) | 
| 2 |  4 | 2012-12-03T00:00:00Z |  11921 |  0 |   2 |  1 |   2 | Creator | Hyun Woo Jang |   KR | 1996-08-19T00:00:00Z |   P |  2 |  3 | 2011-01-12T00:00:00Z | (null) | 
| 2 |  5 | 2012-12-03T00:00:00Z |  11921 |  0 |   2 |  2 |   2 | Creator | Hyun Woo Jang |   KR | 1996-08-19T00:00:00Z |   P |  2 |  3 | 2011-01-12T00:00:00Z | (null) | 
| 1 |  4 | 2012-12-03T00:00:00Z |  11921 |  0 |   3 |  2 |   3 |  Life | Seung Hyun Lee |   KR | 1997-01-11T00:00:00Z |   Z |  3 |  1 | 2012-07-13T00:00:00Z | (null) | 
| 2 |  6 | 2012-12-03T00:00:00Z |  11921 |  0 |   3 |  2 |   3 |  Life | Seung Hyun Lee |   KR | 1997-01-11T00:00:00Z |   Z |  3 |  1 | 2012-07-13T00:00:00Z | (null) | 
| 1 |  1 | 2012-12-04T00:00:00Z |  799 |  0 |   4 |  1 |   4 | DongRaeGu |  Soo Ho Park |   KR | 1991-06-03T00:00:00Z |   Z |  4 |  7 | 2011-02-20T00:00:00Z | (null) | 
| 2 |  7 | 2012-12-03T00:00:00Z |  11924 |  1 |   8 |  1 |   8 | viOLet | Dong Hwan Kim |   KR | 1990-12-05T00:00:00Z |   Z | (null) | (null) |    (null) | (null) | 
| 2 |  8 | 2012-12-03T00:00:00Z |  11924 |  1 |   8 |  3 |   8 | viOLet | Dong Hwan Kim |   KR | 1990-12-05T00:00:00Z |   Z | (null) | (null) |    (null) | (null) | 
| 1 |  9 | 2012-12-03T00:00:00Z |  11924 |  1 |   8 |  3 |   8 | viOLet | Dong Hwan Kim |   KR | 1990-12-05T00:00:00Z |   Z | (null) | (null) |    (null) | (null) | 
| 2 |  1 | 2012-12-04T00:00:00Z |  799 |  0 |  55 |  3 | (null) | (null) |   (null) |  (null) |    (null) | (null) | (null) | (null) |    (null) | (null) | 
| 2 |  2 | 2012-12-03T00:00:00Z |  11921 |  0 |  41 |  0 | (null) | (null) |   (null) |  (null) |    (null) | (null) | (null) | (null) |    (null) | (null) | 
| 1 |  3 | 2012-12-03T00:00:00Z |  11921 |  0 |  21 |  0 | (null) | (null) |   (null) |  (null) |    (null) | (null) | (null) | (null) |    (null) | (null) | 
| 2 |  3 | 2012-12-03T00:00:00Z |  11921 |  0 |  41 |  2 | (null) | (null) |   (null) |  (null) |    (null) | (null) | (null) | (null) |    (null) | (null) | 
| 1 |  5 | 2012-12-03T00:00:00Z |  11921 |  0 |  41 |  1 | (null) | (null) |   (null) |  (null) |    (null) | (null) | (null) | (null) |    (null) | (null) | 
| 1 |  6 | 2012-12-03T00:00:00Z |  11921 |  0 |  21 |  1 | (null) | (null) |   (null) |  (null) |    (null) | (null) | (null) | (null) |    (null) | (null) | 
| 2 |  9 | 2012-12-03T00:00:00Z |  11924 |  1 |  19 |  2 | (null) | (null) |   (null) |  (null) |    (null) | (null) | (null) | (null) |    (null) | (null) | 
| 1 |  10 | 2012-12-03T00:00:00Z |  11924 |  1 |  19 |  2 | (null) | (null) |   (null) |  (null) |    (null) | (null) | (null) | (null) |    (null) | (null) | 
| 2 |  10 | 2012-12-03T00:00:00Z |  11924 |  1 |  12 |  1 | (null) | (null) |   (null) |  (null) |    (null) | (null) | (null) | (null) |    (null) | (null) | 

SQLfiddle Demo

nb: Um zu einer verschwenkten Ansicht der Informations wieder zurück:

select 
     match_id, match_date, tournament 
    , max(case when piv = 1 then real_name end) PlayerAreal_name 
    , max(case when piv = 1 then player_Id end) PlayerA 
    , max(case when piv = 1 then player_Id end) ScoreA 

    , max(case when piv = 2 then real_name end) PlayerBreal_name 
    , max(case when piv = 2 then player_Id end) PlayerB 
    , max(case when piv = 2 then player_Id end) Scoreb 
from (
     the big query above goes here 
    ) 
group by 
    match_id, match_date, tournament 

DEMO

| match_id |   match_date | tournament | PlayerAreal_name | PlayerA | ScoreA | PlayerBreal_name | PlayerB | Scoreb | 
|----------|----------------------|------------|------------------|---------|--------|------------------|---------|--------| 
|  1 | 2012-12-04T00:00:00Z |  799 |  Soo Ho Park |  4 |  4 |   (null) |  55 |  55 | 
|  2 | 2012-12-03T00:00:00Z |  11921 | Hyun Woo Jang |  2 |  2 |   (null) |  41 |  41 | 
|  3 | 2012-12-03T00:00:00Z |  11921 |   (null) |  21 |  21 |   (null) |  41 |  41 | 
|  4 | 2012-12-03T00:00:00Z |  11921 | Seung Hyun Lee |  3 |  3 | Hyun Woo Jang |  2 |  2 | 
|  5 | 2012-12-03T00:00:00Z |  11921 |   (null) |  41 |  41 | Hyun Woo Jang |  2 |  2 | 
|  6 | 2012-12-03T00:00:00Z |  11921 |   (null) |  21 |  21 | Seung Hyun Lee |  3 |  3 | 
|  7 | 2012-12-03T00:00:00Z |  11924 | Dong Nyoung Lee |  1 |  1 | Dong Hwan Kim |  8 |  8 | 
|  8 | 2012-12-03T00:00:00Z |  11924 | Dong Nyoung Lee |  1 |  1 | Dong Hwan Kim |  8 |  8 | 
|  9 | 2012-12-03T00:00:00Z |  11924 | Dong Hwan Kim |  8 |  8 |   (null) |  19 |  19 | 
|  10 | 2012-12-03T00:00:00Z |  11924 |   (null) |  19 |  19 |   (null) |  12 |  12 | 
+0

Kannst du mir bitte helfen, das zu verstehen? Ich verstehe nicht, was piv ist oder woher es kommt und wie es erzeugt wird. Ich nehme an, der Grund, warum sich die Aufzeichnungen von 47k auf 92k verdoppelt haben, ist, dass du jeden Spieler auf seine eigene Linie legst, oder? Wie funktionieren Cross-Joins? Ich habe sie nie benutzt. Ist die 'cj' am Ende dieser kurzen für Cross Join' Cross Join (wählen Sie 1 als Piv Union alle wählen Sie 2) cj'? – noobprogrammer1987

+0

'CROSS JOIN' platziert die Zeilen ohne Bedingung (multipliziert die Zeilen). ist cj = cross join = JA. "piv" ist nur ein Spaltenname, den ich aus der Luft gegriffen habe, kurz für Pivot. Es wird "erzeugt" durch "Wähle 1 als piv union all select 2", probiere es aus, es gibt nur 2 Zeilen aus. "Der Grund, warum sich die Aufzeichnungen von 47k auf 92k verdoppelt haben, ist, dass Sie jeden Spieler auf seine eigene Linie setzen, richtig? *" = JA –

Verwandte Themen