2016-06-22 10 views
1

Ich habe Schwierigkeiten bei der Ausgabe der richtigen Informationen aus meiner SELECT-Abfrage. Das sind Tische, von denen ich ziehe.PHP MySQL komplexen Beitritt

Ich habe eine Liste der Spiele:

SPIELE

id home_team away_team 
1   1   2 
2   3   4 
3   12   16 

Wo diese HOME_TEAM und AWAY_TEAM IDs passen bis zu:

TEAMS

id name 
1  Team A 
2  Team B 
3  Team C 

Zusätzlich habe ich eine Parlays Tisch und Parlay Spiele. Parlay Games verweist auf die Parlays-Tabelle.

Parlays

id userid bettingsiteid wager odds 
1  44  1    1000  2.0 
2  45  5    1500  2.3 
3  12  14    2000  1.8 

PARLAY SPIELE

id parlayid gameid betinfo 
1  1   1   Home Win 
2  1   2   Away Win 
3  1   5   Home Win 
4  2   18  Home Win by 2 goals 

Das ist, was ich in meinem letzten Tisch sehen mag:

Parlay ID Home Team    Away Team    User   Wager Odds 
      Team A     Team B 
1   Team C     name of teams.id = 4 Ridge Robinson 1000  2.0 
      name of teams.id = 12 name of teams.id = 16 
-------------------------------------------------------------- (<tr> border) 
      Team C     name of teams.id = 4 
2   name of teams.id = x name of teams.id = x 
-------------------------------------------------------------- (<tr> border) 

Ich hoffe, das macht Sinn. Ich möchte nur die Parlay-ID und dann den Namen jeder Heim- und Auswärtsmannschaft in der Parlay.

Dies ist meine Auswahlabfrage ich derzeit versuche:

SELECT 
     u.first_name AS 'User First Name', 
     u.last_name AS 'User Last Name', 
     u.id AS 'User ID', 
     ht.name AS 'Home Team', 
     away.name AS 'Away Team', 
     p.wager AS 'Wager', 
     p.odds AS 'Odds', 
     pg.parlayid AS 'Parlay ID', 
     pg.betinfo AS 'Bet Info', 
     pg.gameid AS 'Game ID', 
     g.date AS 'Game Date', 
     b.betting_site_name AS 'Betting Site' 
    FROM parlays p 
    JOIN parlaygames pg ON p.id = pg.parlayid 
    JOIN games g ON pg.gameid = g.id 
    JOIN teams ht ON g.home_team = ht.id 
    JOIN teams away ON g.away_team = away.id 
    JOIN users u ON u.id = p.userid 
    JOIN bonuses b ON p.bettingsiteid = b.id 
    ORDER BY 
     pg.parlayid, 
     pg.gameid 

Und das ist mein Tabellencode:

<table class="table table-striped"> 
     <tr> 
      <th>User Name</th> 
      <th>Date</th> 
      <th>Betting Site</th> 
      <th>Home Team</th> 
      <th>Away Team</th> 
      <th>Wager</th> 
      <th>Odds</th> 
      <th>Manager</th> 
      <th>Bet Info</th> 
      <th>Success</th> 
      <th>Edit</th> 
     </tr> 
<?php  

while($row = $result->fetch_array()) { 
$hometeams = implode(' ',$row['Home Team']); 

     $output = '<tr>'; 
    $output .= '<td><a href="userprofile.php?id='.$row['User ID'].'">'.$row['User First Name'].' '.$row['User Last Name'].'</a></td>'; 
    $output .= '<td>'.$row['Game Date'].'</td>'; 
    $output .= '<td>'.$row['Betting Site'].'</td>'; 
    $output .= '<td>'.$hometeams.'</td>'; 
    $output .= '<td>'.$row['Away Team'].'</td>'; 
    $output .= '<td>'.$row['Wager'].' kr</td>'; 
    $output .= '<td>'.$row['Odds'].'</td>'; 
    $output .= '<td><a href="managerprofile.php?id='.$row['Manager ID'].'">'.$row['Manager First Name'].' '.$row['Manager Last Name'].'</a></td>'; 
    $output .= '<td>'.$row['Bet Info'].'</td>'; 
    $output .= '<td>'.$row['Success'].'</td>'; 
    $output .= '<td><a href="edit_userbet.php?id='.$row['User ID'].'&betsite='.$row['Betting ID'].'&gameid='.$row['Game ID'].'&wager='.$row['Wager'].'&odds='.$row['Odds'].'&betinfo='.$row['Bet Info'].'" class="btn btn-default btn-sm">Edit</a></td>'; 
    $output .= '</tr>'; 

    echo $output; 
} 

?> 
</table> 

Aber das ist sehr falsch, wie ich eine Tabelle immer bin, das zeigt (dumbed unten)

Parlay ID Home Team Away Team Wager Odds 
1   1   1   1000  2.0 
1   2   2   1000  2.0 
1   3   3   1000  2.0 
-------------------------------------------------------------- (<tr> border) 

ich weiß, das ist, weil ich $ GameID eingefügt, aber ich bin nicht sicher, wie das Haus und weg Tee zu bekommen M Namen pro Spiel-ID, ohne $ Spiel pro Zeile zu referenzieren.

Hat jemand irgendwelche Vorschläge?

EDIT Einer der Gründe dafür, dass ich die Tabelle wie folgt organisiere ist da, in meinem parlays Tisch, zusätzlich zu dem nur der Parlay-ID und Heimelf/auswärtig ... ich eine Wette auch haben und Eine Quote für jeden Satz aufgeführt. Vielleicht hat jemand eine bessere Vorstellung von einer Fremdschlüsselbeziehung, die besser funktionieren und dieses Problem auf diese Weise lösen könnte?

** BEARBEITEN # 2 ** Ich habe meine DB-Tabellenstruktur geändert, brauche aber immer noch Hilfe bei der Anzeige meiner Frontend-Tabelle!

+1

Ihre Tabellenstruktur von Parlays ist schlechtes Design. Eine kommagetrennte Liste gegenüber einer tatsächlichen Tabelle eines kombinierten Primärschlüssels (ParlayID, GameID) zu haben und jedes einzelne Spiel als eigene Zeile mit dem entsprechenden Parlay zu haben. DANN sollte deine Abfrage funktionieren .. andernfalls musst du dich den explodierten Werten jeder Parlay-ID anschließen. – DRapp

+0

DRapp ... Ich kann verstehen, dass dies ein schlechtes Design sein kann. Ich bin sicherlich offen für Vorschläge. Würde es Ihnen etwas ausmachen, etwas mehr auf Ihren Vorschlag zu erweitern? Ich verstehe nicht ganz, wie ich es so einrichten kann, weil ich nicht sicher bin, welche Partien oder wie viele Partien gespielt werden. Vielleicht verstehe ich die Logik dahinter nicht? –

Antwort

2

Ihr primäres Konzept ist in Ordnung, aber das Layout der Tabellen sollte für die Parlays leicht geändert werden. Ändern Sie Ihre Parlay Tisch zu so etwas wie ...

REVISION pro andere Gegenstände identifiziert ...

Parlay 
ID Wager Odds 
1 $5  3:1 
2 $2  2:1 
3 $5  7:1 

ParlayGames 
ID ParlayID GameID 
1 1   1 
2 1   2 
3 1   3 
4 2   2 
5 2   9 
6 3   12 
6 3   3 
6 3   18 

Nun sollte Ihre Anfrage perfekt sein zu gehen.

select 
     p.wager, 
     p.odds, 
     pg.parlayID, 
     pg.gameID, 
     ht.name as HomeTeam, 
     away.name as AwayTeam 
    from 
     Parlay p 
     join ParlayGames PG 
      on p.ID = pg.parlayID 
      join Games g 
       on pg.GameID = g.ID 
       join Teams ht 
        on g.home_team = ht.id 
       join Teams away 
        on g.away_team = away.id 
    order by 
     Pg.ParlayID, 
     pg.gameID 

Nun kann die Parlay-Tabelle so viele Spiele haben, wie Sie benötigen ... 2 oder 200+

PER ÜBERARBEITUNGEN und weitere Details, sollte folgende ziehen Daten helfen. Ich erstellte ein SQLFiddle-Beispiel für Sie, um die Daten zu sehen, gefüllt und abgefragt, um alle Ergebnisse zu erhalten. Ich habe sogar eine zweite Anfrage gemacht, die die Ergebnisse mit dem Inhalt vorformatiert. Könnte Overkill vs PHP-Verkettung sein, aber nur eine Auswahl von dem, was Sie tun könnten.

Anyhow, check out SQLFiddle, and below is the full copy of creating tables and sample data and final queries

CREATE TABLE Teams ( 
    id int not null primary key, 
    name varchar(10) ); 

insert into Teams 
    (id, name) 
    values 
    (1, 'Team A'), 
    (2, 'Team B'), 
    (3, 'Team C'), 
    (4, 'Team 4'), 
    (12, 'Team 12'), 
    (16, 'Team 16'); 

CREATE TABLE Games (
    id int not null primary key, 
    home_team int, 
    away_team int, 
    gameDate datetime, 
    winning_team int); 

INSERT INTO games 
    (id, home_team, away_team, gameDate, winning_team) 
    VALUES 
    (1, 1, 2, '2016-06-01', 1), 
    (2, 3, 4, '2016-06-02', 4), 
    (3, 12, 16, '2016-06-03', 16), 
    (18, 4, 12, '2016-06-09', 4); 

CREATE TABLE BettingSite (
    id int not null primary key, 
    betting_site_name varchar(10)); 

insert into BettingSite 
    (id, betting_site_name) 
    values 
    (1, 'Betting 1'), 
    (5, 'Betting 5'), 
    (14, 'Betting 14'); 

CREATE TABLE Users (
    id int not null primary key, 
    first_name varchar(10), 
    last_name varchar(10)); 

insert into Users 
    (id, first_name, last_name) 
    values 
    (12, 'First 12', 'Last 12'), 
    (44, 'F44', 'L44'), 
    (45, '45 User', '45 Last'); 

CREATE TABLE Parlays (
    id int not null primary key, 
    userid int, 
    bettingsiteid int, 
    wager int, 
    odds float(2)); 

insert into Parlays 
    (id, userid, bettingsiteid, wager, odds) 
    values 
    (1, 44, 1, 1000, 2.0), 
    (2, 45, 5, 1500, 2.3), 
    (3, 12, 14, 2000, 1.8); 

CREATE TABLE ParlayGames (
    id int not null primary key, 
    parlayid int, 
    gameid int, 
    betinfo varchar(30)); 

insert into ParlayGames 
    (id, parlayid, gameid, betinfo) 
    values 
    (1, 1, 1, 'Home Win'), 
    (2, 1, 2, 'Away Win'), 
    (3, 1, 5, 'Home Win'), 
    (4, 2, 18, 'Home by 2 goals'), 
    (5, 3, 2, 'Home Win'), 
    (6, 3, 18, 'Home Win'); 


SELECT 
     pg.ParlayID, 
     pg.gameid, 
     g.gameDate, 
     g.winning_team, 
     ht.name AS HomeTeam, 
     away.name AS AwayTeam, 
     u.first_name, 
     u.last_name, 
     u.id AS UserID, 
     p.wager, 
     p.odds, 
     pg.betinfo, 
     g.gamedate, 
     bs.betting_site_name 
    FROM 
     parlays p 
     JOIN parlaygames pg 
      ON p.id = pg.parlayid 
      JOIN games g 
       ON pg.gameid = g.id 
       JOIN teams ht 
        ON g.home_team = ht.id 
       JOIN teams away 
        ON g.away_team = away.id 
     JOIN users u 
      ON p.userid = u.id 
     JOIN BettingSite bs 
      ON p.bettingsiteid = bs.id 
    ORDER BY 
     pg.parlayid, 
     pg.gameid; 


SELECT 
     concat('<tr><td><a href="userprofile.php?id=', u.id, '">', u.first_name, ' ', u.last_name, '</a></td>') as User, 
     concat('<td>', g.gameDate, '</td>') as GameDate, 
     concat('<td>', bs.betting_site_name, '</td>') as BettingSite, 
     concat('<td>', ht.name, '</td>') as HomeTeam, 
     concat('<td>', away.name, '</td>') as AwayTeam, 
     concat('<td>', p.wager, '</td>') as Wager, 
     concat('<td>', p.odds, '</td>') as Odds, 
     concat('<td><a href="managerprofile.php?id=', 123, '">', 'manager first name', ' ', 'manager last name', '</a></td>') as Manager, 
     concat('<td>', pg.betinfo, '</td>') as BetInfo, 
     concat('<td>', 'Was it successful', '</td>') as WasSuccess, 
     concat('<td><a href="edit_userbet.php?id=', u.id, 
      '&betsite=', bs.id, 
      '&gameid=', g.id, 
      '&wager=', p.wager, 
      '&odds=', p.odds, 
      '&betinfo=', pg.betinfo, ' class="btn btn_default btn_sm">Edit</a></td>') as EditLink 
    FROM 
     parlays p 
     JOIN parlaygames pg 
      ON p.id = pg.parlayid 
      JOIN games g 
       ON pg.gameid = g.id 
       JOIN teams ht 
        ON g.home_team = ht.id 
       JOIN teams away 
        ON g.away_team = away.id 
     JOIN users u 
      ON p.userid = u.id 
     JOIN BettingSite bs 
      ON p.bettingsiteid = bs.id 
    ORDER BY 
     pg.parlayid, 
     pg.gameid; 

Einige Code, den ich für Sie zusammen zu ziehen versucht, ... etwas andere Ausgabelayout als Sie wollten. Ich habe einen zweizeiligen Zusammenhang gemacht. Zuerst legen Sie für jede Parlay die Informationen zu Person und Wette fest. Dann eine nächste Gruppe aller Wetten innerhalb des Parlays. Bitte beachten Sie .. Ich bin kein PHP-Entwickler, aber die Sache folgt und sollte dazu beitragen, zu verstehen, was ich versuche zu tun. Ich weiß auch, dass ich nicht die "Manager" -Information in meinen Abfragetabelle-Beispielen habe, und meine Spaltennamen basieren auf meiner Abfrage von SQLFiddle (ich mag es nicht, Leerzeichen in Spaltennamen zu haben).

<table> 

<?php 

// hold values to identify break between each parlay 
$lastParlay = 0; 
// build string of header for each parlay 
$curParlayBet = ''; 
// and another for each game WITHIN a parlay 
$curParlayGames = ''; 

// start loop to fetch details 
while($row = $result->fetch_array()) 
{ 
    // is the current record parlay ID the same as the previous record? 
    if($lastParlay != $row['ParlayID']) 
    { 
     $lastParlay = $row['ParlayID']; 

     // if NOT equal, was there something prepared for the last parlay? 
     if(strlen($curParlayBet) > 0) 
     { 
      // yes, we had something prepared, dump it now. 
      PrintOneParlay($curParlayBet, $curParlayGames); 
     } 

     // at beginning of each new parlay, preserve the ID for next read cycle 
     // and only need to prepare the holding string when parlay changes 
     $curParlayBet = '<tr>' 
      . ' <td><a href="userprofile.php?id=' 
       . $row['UserID'] . '">' 
       . $row['UserFirstName'] .' ' 
       . $row['UserLastName'] 
       . '</a></td>' 
      . '<td>' . $row['BettingSite'] . '</td>' 
      . '<td>' . $row['Wager'] . '</td>' 
      . '<td>' . $row['Odds'] . '</td>' 
      . '<td><a href="managerprofile.php?id=' 
       . $row['ManagerID'] . '">' 
       . $row['ManagerFirstName'] .' ' 
       . $row['ManagerLastName'] . '</a></td>' 
      . '<td>' . $row['BetInfo'] . '</td>' 
      . '<td>' . $row['Success'] . '</td>' 
      . '</tr>'; 

     // always clear the rows of games as each parlay starts 
     $curParlayGames = ''; 
     OneGame($row); 
    } 

    // now, add rows for every game in each parlay. 
    $curParlayGames .= OneGame($row); 

    echo $output; 
} 

// at completion of the loop, if anything pending, force a write 
// based on the last record processed. 
if(strlen($curParlayGames) > 0 ) 
    PrintOneParlay($curParlayBet, $curParlayGames); 



function OneGame($curRow) 
{ 
    RETURN '<tr>' 
     . '<td />' 
     . '<td>' . $curRow['GameDate'] .'</td>' 
     . '<td>' . $curRow['HomeTeam'] .'</td>' 
     . '<td>' . $curRow['AwayTeam'] .'</td>' 
     . '<td colspan="3"><a href="edit_userbet.php?id=' 
      . $curRow['UserID'] 
      . '&betsite=' . $curRow['BettingID'] 
      . '&gameid=' . $curRow['GameID'] 
      . '&wager=' . $curRow['Wager'] 
      . '&odds=' . $curRow['Odds'] 
      . '&betinfo=' . $curRow['BetInfo'] 
      . '" class="btn btn-default btn-sm">Edit</a></td>' 
     . '</tr>'; 
} 

function PrintOneParlay($parlayBet, $parlayGames) 
{ 
    // first dump the per parlay header info 
    echo '<tr>' 
     . ' <td>User</td>' 
     . ' <td>Betting Site</td>' 
     . ' <td>Wager</td>' 
     . ' <td>Odds</td>' 
     . ' <td>Manager</td>' 
     . ' <td>Bet Info</td>' 
     . ' <td>Win/Lose</td>' 
     . '</tr>'; 

    // now the data of who placed the bet info 
    echo $parlayBet 

    // now header info showing all games within the parlay 
    echo '<tr>' 
     . ' <td />' 
     . ' <td>Game Date</td>' 
     . ' <td>Home Team</td>' 
     . ' <td>Away Team</td>' 
     . ' <td colspan="3">Edit</td>' 
     . '</tr>'; 

    // finally all the games 
    echo $parlayGames; 
} 

?> 

</table> 
+0

Ich sehe was du sagst ... das macht viel Sinn. Ich werde daran arbeiten, diesen Code zu implementieren und komme mit einem weiteren Kommentar zurück. –

+0

DRapp ... vielleicht haben Sie auch einen Vorschlag dafür. Ich habe einen Teil des Tisches, den ich für meinen parlays-Tisch habe, weggelassen, da ich es für die Logik nicht nötig fand, aber jetzt bin ich unsicher, wie ich es umsetzen soll. Ich habe eine einzelne Wette und einzelne Chancen, die für eine Parlay sind, nicht für die einzelnen Spiele als Teil der Parlay. Weißt du, wie ich diese umsetzen könnte? Vielleicht muss ich eine weitere Tabelle mit diesen Informationen hinzufügen? –

+0

@RidgeRobinson, fügen Sie die Spalten zur Parlay-Tabelle hinzu. – DRapp