join - zwei Spalten

dev4678

Benutzer
Beiträge
8
Hallo,
ich habe ein Problem und zwar habe ich eine Tabelle Club da stehen die Club Namen und die dazugehörige id,
dann hab ich noch die Tabelle Spielergebnis da steht jetzt Heim und Gast. In Heim und Gast stehen jetzt id´s und jetzt will ich halt das bei Heim und Gast die Namen aus der Tabelle Club dargestellt werden, halt ein join.
Ich hab das jetzt so versucht:

select club.Name as Heim, club.Name as Gast, ToreHeim, ToreGast, Spieltag, Datum from club, spielergebnis where club.id = spielergebnis.Heim or club.id = spielergebnis.Gast

Leider bekomm ich bei Heim und Gast die selbe Mannschaft angezeigt, obwohl da eine andere id steht.
Hab keine Idee mehr wie ich mein Problem lösen kann.
 
Werbung:
Hallo,
ich habe ein Problem und zwar habe ich eine Tabelle Club da stehen die Club Namen und die dazugehörige id,
dann hab ich noch die Tabelle Spielergebnis da steht jetzt Heim und Gast. In Heim und Gast stehen jetzt id´s und jetzt will ich halt das bei Heim und Gast die Namen aus der Tabelle Club dargestellt werden, halt ein join.
Ich hab das jetzt so versucht:

select club.Name as Heim, club.Name as Gast, ToreHeim, ToreGast, Spieltag, Datum from club, spielergebnis where club.id = spielergebnis.Heim or club.id = spielergebnis.Gast

Leider bekomm ich bei Heim und Gast die selbe Mannschaft angezeigt, obwohl da eine andere id steht.
Hab keine Idee mehr wie ich mein Problem lösen kann.

Stelle das auf expliziete JOIN-Syntax um, dann ist das ganz einfach. Sinngemäß etwa so:

Code:
select heim.name as heim, gast.name as gast
from spiele
  left join club heim on spiele.heim_id=heim.id
  left join club gast on spiele.gast_id = gast.id
...
 
Vielen Dank, dass hat super geklappt,

jetzt hab ich noch eine Frage, ich hab ein sql Befehl, der mir meine Spielergebnisse ausrechnet und jetzt will wieder ein join auf die Tabelle spielergebnis machen, also das anstatt in der Spalte Id, meine club Namen von der Tabelle club drin stehen.

Code:
SELECT Id,
                            SUM(AnzahlSpiele) as AnzahlSpiele,
                            SUM(Tore) as Tore, SUM(Gegentore) as Gegentore,
                            SUM(Tore) - SUM(Gegentore) as ToreDiff,
                            SUM(Tore) / SUM(AnzahlSpiele) as ToreProSpiel,
                            SUM(Sieg) as Siege,
                            SUM(Niederlage) as Niederlagen,
                            SUM(Unentschieden) as Unentschieden,
                            SUM(Sieg) * 3 + SUM(Unentschieden) as Punkte

                            FROM
                            (SELECT Heim as Id, 1 as AnzahlSpiele,
                                ToreHeim as Tore,
                                ToreGast as Gegentore,
                                CASE WHEN ToreHeim > ToreGast THEN 1 ELSE 0 END AS Sieg,
                                CASE WHEN ToreHeim < ToreGast THEN 1 ELSE 0 END AS Niederlage,
                                CASE WHEN ToreHeim = ToreGast THEN 1 ELSE 0 END AS Unentschieden
                            FROM spielergebnis
                            UNION ALL
                                SELECT     Gast as Id, 1 as AnzahlSpiele, ToreGast as Tore, ToreHeim as Gegentore,
                                CASE WHEN ToreGast > ToreHeim THEN 1 ELSE 0 END AS Sieg,
                                CASE WHEN ToreGast < ToreHeim THEN 1 ELSE 0 END AS Niederlage,
                                CASE WHEN ToreGast = ToreHeim THEN 1 ELSE 0 END AS Unentschieden
                                FROM spielergebnis

                                ) as SplittedView

                                GROUP BY Id
                                ORDER BY Punkte DESC, ToreDiff DESC

Jetzt ist das Problem, wenn ich ein join mache, berechnet er mir die Spalten falsch, z.b AnzahlSpiele usw...
 
Vielen Dank, dass hat super geklappt,

jetzt hab ich noch eine Frage, ich hab ein sql Befehl, der mir meine Spielergebnisse ausrechnet und jetzt will wieder ein join auf die Tabelle spielergebnis machen, also das anstatt in der Spalte Id, meine club Namen von der Tabelle club drin stehen.

Code:
SELECT Id,
                            SUM(AnzahlSpiele) as AnzahlSpiele,
                            SUM(Tore) as Tore, SUM(Gegentore) as Gegentore,
                            SUM(Tore) - SUM(Gegentore) as ToreDiff,
                            SUM(Tore) / SUM(AnzahlSpiele) as ToreProSpiel,
                            SUM(Sieg) as Siege,
                            SUM(Niederlage) as Niederlagen,
                            SUM(Unentschieden) as Unentschieden,
                            SUM(Sieg) * 3 + SUM(Unentschieden) as Punkte

                            FROM
                            (SELECT Heim as Id, 1 as AnzahlSpiele,
                                ToreHeim as Tore,
                                ToreGast as Gegentore,
                                CASE WHEN ToreHeim > ToreGast THEN 1 ELSE 0 END AS Sieg,
                                CASE WHEN ToreHeim < ToreGast THEN 1 ELSE 0 END AS Niederlage,
                                CASE WHEN ToreHeim = ToreGast THEN 1 ELSE 0 END AS Unentschieden
                            FROM spielergebnis
                            UNION ALL
                                SELECT     Gast as Id, 1 as AnzahlSpiele, ToreGast as Tore, ToreHeim as Gegentore,
                                CASE WHEN ToreGast > ToreHeim THEN 1 ELSE 0 END AS Sieg,
                                CASE WHEN ToreGast < ToreHeim THEN 1 ELSE 0 END AS Niederlage,
                                CASE WHEN ToreGast = ToreHeim THEN 1 ELSE 0 END AS Unentschieden
                                FROM spielergebnis

                                ) as SplittedView

                                GROUP BY Id
                                ORDER BY Punkte DESC, ToreDiff DESC

Jetzt ist das Problem, wenn ich ein join mache, berechnet er mir die Spalten falsch, z.b AnzahlSpiele usw...


Ich weiß ja nicht, was Du gemacht hast, aber das sollte etwa so gehen:

Code:
select foo.*, club.name from (dein obiges select) foo left join club on foo.id=club.id

*untested*
 
Mein Problem konnte ich leider immer noch nicht lösen egal wie ich es versuche...
Hier ist mal eine Lösung von vielen die alle nicht funktionieren.

Code:
                            SELECT  Id,
                            SUM(AnzahlSpiele) as AnzahlSpiele,
                            SUM(Tore) as Tore, SUM(Gegentore) as Gegentore,
                            SUM(Tore) - SUM(Gegentore) as ToreDiff,
                            SUM(Tore) / SUM(AnzahlSpiele) as ToreProSpiel,
                            SUM(Sieg) as Siege,
                            SUM(Niederlage) as Niederlagen,
                            SUM(Unentschieden) as Unentschieden,
                            SUM(Sieg) * 3 + SUM(Unentschieden) as Punkte

                            FROM
                            (SELECT Heim as Id, 1 as AnzahlSpiele,
                                ToreHeim as Tore,
                                ToreGast as Gegentore,
                                CASE WHEN ToreHeim > ToreGast THEN 1 ELSE 0 END AS Sieg,
                                CASE WHEN ToreHeim < ToreGast THEN 1 ELSE 0 END AS Niederlage,
                                CASE WHEN ToreHeim = ToreGast THEN 1 ELSE 0 END AS Unentschieden
                            FROM spielergebnis
                            left join club on Club.id = spielergebnis.Heim
                       
                            UNION ALL
                                SELECT     Gast as Id, 1 as AnzahlSpiele, ToreGast as Tore, ToreHeim as Gegentore,
                                CASE WHEN ToreGast > ToreHeim THEN 1 ELSE 0 END AS Sieg,
                                CASE WHEN ToreGast < ToreHeim THEN 1 ELSE 0 END AS Niederlage,
                                CASE WHEN ToreGast = ToreHeim THEN 1 ELSE 0 END AS Unentschieden
                                FROM spielergebnis
                                 left join club on Club.id = spielergebnis.Gast

                                ) as SplittedView
       
                                GROUP BY Id
                                ORDER BY Punkte DESC, ToreDiff DESC,Tore DESC

Hier berechnet er auch schon die Summierung der Spalten falsch auch fehlt noch ein select damit mir auch die gewünschte Spalte angzeigt wird , wie z.b SELECT club.Name as Club.
 
Hier berechnet er auch schon die Summierung der Spalten falsch auch fehlt noch ein select damit mir auch die gewünschte Spalte angzeigt wird , wie z.b SELECT club.Name as Club.

In Deinem Select, was SplittedView ergibt, mischt Du ja auch alles zusammen.

Zeig doch mal Deine Tabellen, wie die genau aufgebaut sind. Und dazu ein paar Demo-Datensätze, und was Du erwartest bzw. erreichen willst.
 
Mit dem Sql Befehl wird anhand der Tabelle Spielergebnis alle Spiele berechnet, die Clubs bekommen so ihre Punkte, Siege usw...
Jetzt gibt es eine Spalte Id, in der Spalte sollen jetzt nicht die Id´s stehen sondern die Club Namen von der Tabelle Club.

Tabelle die mit dem Sql Befehl erzeugt wird
http://www.fotos-hochladen.net/view/tabellexw32159o7d.png
http://[url=http://www.fotos-hochladen.net/view/tabellexw32159o7d.png]
[img]http://img5.fotos-hochladen.net/thumbnail/tabellexw32159o7d_thumb.jpg
Tabelle Clubs
http://www.fotos-hochladen.net/view/clubtabelleyroak469x5.png
Tabelle Spielergebnis
http://www.fotos-hochladen.net/view/spielergebnistam3w4z89frq.png

Da der Menüpunkt Bild einfügen irgendwie nicht funktioniert hab ich das jetzt so gemacht.
 
Zuletzt bearbeitet von einem Moderator:
Tabelle Club
Code:
CREATE TABLE IF NOT EXISTS `club` (
`id` int(11) NOT NULL,
  `Name` char(255) NOT NULL,
  `Trainer` char(255) NOT NULL,
  `Stadion` char(255) NOT NULL
) ENGINE=InnoDB AUTO_INCREMENT=19 DEFAULT CHARSET=latin1;

Code:
INSERT INTO `club` (`id`, `Name`, `Trainer`, `Stadion`) VALUES
(1, '1. FC Koeln', 'Peter Stoeger', 'RheinEnergieStadion'),
(2, '1. FSV Mainz 05', 'Kasper Hjulmand', 'Coface Arena'),
(3, 'Bayer 04 Leverkusen', 'Roger Schmidt', 'BayArena'),
(4, 'Borussia Dortmund', 'Juergen Kopp', 'Signal Iduna Park'),
(5, 'Borussia Moenchengladbach', 'Lucien Favre', 'Stadion im Borussia-Park'),
(6, 'Eintracht Frankfurt', 'Thomas Schaaf', 'Commerzbank-Arena'),
(7, 'FC Augsburg', 'Markus Weinzierl', 'SGL arena'),
(8, 'FC Bayern Muenchen    ', 'Pep Guardiola', 'Allianz Arena'),
(9, 'FC Schalke 04', 'Roberto Di Matteo', 'Veltins-Arena'),
(10, 'Hamburger SV', 'Josef Zinnbauer', 'Imtech Arena'),
(11, 'Hannover 96', 'Tayfun Korkut', 'HDI-Arena'),
(12, 'Hertha BSC', 'Jos Luhukay', 'Olympiastadion'),
(13, 'SC Paderborn 07', 'Andre Breitenreiter', 'Benteler-Arena'),
(14, 'Werder Bremen', 'Viktor Skripnik', 'Weserstadion'),
(15, 'SC Freiburg', 'Christian Streich', 'Schwarzwald-Stadion'),
(16, 'TSG 1899 Hoffenheim', 'Markus Gisdol', 'Wirsol Rhein-Neckar-Arena'),
(17, 'VfB Stuttgart', 'Huub Stevens', 'Mercedes-Benz Arena'),
(18, 'VfL Wolfsburg', 'Dieter Hecking', 'Volkswagen Arena');

Tabelle Spielergbnis
Code:
CREATE TABLE IF NOT EXISTS `spielergebnis` (
`Spielnummer` int(11) NOT NULL,
  `Heim` int(11) NOT NULL,
  `Gast` int(11) NOT NULL,
  `ToreHeim` int(11) NOT NULL,
  `ToreGast` int(11) NOT NULL,
  `Spieltag` int(11) NOT NULL,
  `Datum` date NOT NULL
) ENGINE=InnoDB AUTO_INCREMENT=1739 DEFAULT CHARSET=latin1;

Code:
INSERT INTO `spielergebnis` (`Spielnummer`, `Heim`, `Gast`, `ToreHeim`, `ToreGast`, `Spieltag`, `Datum`) VALUES
(1730, 8, 18, 2, 1, 1, '2014-08-22'),
(1731, 16, 7, 2, 0, 1, '2014-08-23'),
(1732, 11, 9, 2, 1, 1, '2014-08-23'),
(1733, 12, 14, 2, 2, 1, '2014-08-23'),
(1734, 6, 15, 1, 0, 1, '2014-08-23'),
(1735, 1, 10, 0, 0, 1, '2014-08-23'),
(1736, 4, 3, 0, 2, 1, '2014-08-23'),
(1737, 13, 2, 2, 2, 1, '2014-08-24'),
(1738, 5, 17, 1, 1, 1, '2014-08-24');

Ich hoffe mal das man damit was anfangen kannst.
 
Ich hoffe mal das man damit was anfangen kannst.

Und was suchst Du nun?

Das hier?

Code:
test=*# select c.name, s.* from (select heim as id, 1 as anzahlspiele, toreheim as tore, toregast as gegentore, case when toreheim > toregast then 1 else 0 end as sieg, case when toreheim < toregast then 1 else 0 end as niederlage, case when toreheim = toregast then 1 else 0 end as unentschieden from spielergebnis union all select gast as id, 1 , toregast, toreheim, case when toregast > toreheim then 1 else 0 end, case when toregast < toreheim then 1 else 0 end, case when toregast = toreheim then 1 else 0 end from spielergebnis) s left join club c on s.id=c.id;
  name  | id | anzahlspiele | tore | gegentore | sieg | niederlage | unentschieden
---------------------------+----+--------------+------+-----------+------+------------+---------------
 FC Bayern Muenchen  |  8 |  1 |  2 |  1 |  1 |  0 |  0
 TSG 1899 Hoffenheim  | 16 |  1 |  2 |  0 |  1 |  0 |  0
 Hannover 96  | 11 |  1 |  2 |  1 |  1 |  0 |  0
 Hertha BSC  | 12 |  1 |  2 |  2 |  0 |  0 |  1
 Eintracht Frankfurt  |  6 |  1 |  1 |  0 |  1 |  0 |  0
 1. FC Koeln  |  1 |  1 |  0 |  0 |  0 |  0 |  1
 Borussia Dortmund  |  4 |  1 |  0 |  2 |  0 |  1 |  0
 SC Paderborn 07  | 13 |  1 |  2 |  2 |  0 |  0 |  1
 Borussia Moenchengladbach |  5 |  1 |  1 |  1 |  0 |  0 |  1
 VfL Wolfsburg  | 18 |  1 |  1 |  2 |  0 |  1 |  0
 FC Augsburg  |  7 |  1 |  0 |  2 |  0 |  1 |  0
 FC Schalke 04  |  9 |  1 |  1 |  2 |  0 |  1 |  0
 Werder Bremen  | 14 |  1 |  2 |  2 |  0 |  0 |  1
 SC Freiburg  | 15 |  1 |  0 |  1 |  0 |  1 |  0
 Hamburger SV  | 10 |  1 |  0 |  0 |  0 |  0 |  1
 Bayer 04 Leverkusen  |  3 |  1 |  2 |  0 |  1 |  0 |  0
 1. FSV Mainz 05  |  2 |  1 |  2 |  2 |  0 |  0 |  1
 VfB Stuttgart  | 17 |  1 |  1 |  1 |  0 |  0 |  1
(18 rows)
 
Vielen Dank, ja genau das suche ich, nur die Spalte id sollte dann nicht mehr ausgeben werden.

Code:
select c.name,
s.*,
SUM(sieg) * 3 + SUM(unentschieden) as Punkte,
SUM(tore) - SUM(gegentore) as ToreDiff

from (select heim as id, 1 as anzahlspiele,
      toreheim as tore,
      toregast as gegentore,
      case when toreheim > toregast then 1 else 0 end as sieg,
      case when toreheim < toregast then 1 else 0 end as niederlage,
      case when toreheim = toregast then 1 else 0 end as unentschieden
     
      from spielergebnis
      union all select gast as id, 1 , toregast, toreheim,
      case when toregast > toreheim then 1 else 0 end,
      case when toregast < toreheim then 1 else 0 end,
      case when toregast = toreheim then 1 else 0 end from spielergebnis)
      s left join club c on s.id=c.id
     
      group by name
      order by Punkte desc, ToreDiff desc, SUM(tore) desc

Wenn ich jetzt die id im select entferne, dann fallen andere Spalten wieder weg...
 
Wenn ich jetzt die id im select entferne, dann fallen andere Spalten wieder weg...

Du stellst Dich aber auch echt an, ... durch das s.* im Select-Teil sagst Du ja, daß alle angezeigt werden soll. Nenne halt die Spalten, die Du sehen willst, das * ist nur die pure Faulheit.

Code:
test=*# select c.name, s.anzahlspiele, s.tore, s.gegentore, s.sieg, s.niederlage, s.unentschieden from (select heim as id, 1 as anzahlspiele, toreheim as tore, toregast as gegentore, case when toreheim > toregast then 1 else 0 end as sieg, case when toreheim < toregast then 1 else 0 end as niederlage, case when toreheim = toregast then 1 else 0 end as unentschieden from spielergebnis union all select gast as id, 1 , toregast, toreheim, case when toregast > toreheim then 1 else 0 end, case when toregast < toreheim then 1 else 0 end, case when toregast = toreheim then 1 else 0 end from spielergebnis) s left join club c on s.id=c.id;
  name  | anzahlspiele | tore | gegentore | sieg | niederlage | unentschieden
---------------------------+--------------+------+-----------+------+------------+---------------
 FC Bayern Muenchen  |  1 |  2 |  1 |  1 |  0 |  0
 TSG 1899 Hoffenheim  |  1 |  2 |  0 |  1 |  0 |  0
 Hannover 96  |  1 |  2 |  1 |  1 |  0 |  0
 Hertha BSC  |  1 |  2 |  2 |  0 |  0 |  1
 Eintracht Frankfurt  |  1 |  1 |  0 |  1 |  0 |  0
 1. FC Koeln  |  1 |  0 |  0 |  0 |  0 |  1
 Borussia Dortmund  |  1 |  0 |  2 |  0 |  1 |  0
 SC Paderborn 07  |  1 |  2 |  2 |  0 |  0 |  1
 Borussia Moenchengladbach |  1 |  1 |  1 |  0 |  0 |  1
 VfL Wolfsburg  |  1 |  1 |  2 |  0 |  1 |  0
 FC Augsburg  |  1 |  0 |  2 |  0 |  1 |  0
 FC Schalke 04  |  1 |  1 |  2 |  0 |  1 |  0
 Werder Bremen  |  1 |  2 |  2 |  0 |  0 |  1
 SC Freiburg  |  1 |  0 |  1 |  0 |  1 |  0
 Hamburger SV  |  1 |  0 |  0 |  0 |  0 |  1
 Bayer 04 Leverkusen  |  1 |  2 |  0 |  1 |  0 |  0
 1. FSV Mainz 05  |  1 |  2 |  2 |  0 |  0 |  1
 VfB Stuttgart  |  1 |  1 |  1 |  0 |  0 |  1
(18 rows)
 
Werbung:
Das hättest du jetzt nicht nochmal extra machen müssen, ach ja die Tabelle "s" zu nennen war etwas verwirrend, ist ja schon spät.
Nochmal vielmals Danke
 
Zurück
Oben