2016-06-22 3 views
1

У меня возникли трудности с выводом правильной информации из моего запроса SELECT. Это таблицы, из которых я выхожу.PHP MySQL complex join

У меня есть список игр:

ИГРЫ

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

Где эти HOME_TEAM и AWAY_TEAM идентификаторы совпадают с:

КОМАНД

id name 
1  Team A 
2  Team B 
3  Team C 

Кроме того, у меня есть игры и игры в игровые автоматы. Parlay Games ссылается на таблицу 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 ИГРЫ

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 

Это то, что я хотел бы видеть в своей итоговой таблице:

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) 

Я надеюсь, что имеет смысл. Я просто хочу идентификатор parlay, а затем имя каждого дома и команды гостей в parlay.

Это мой запрос на выборке В настоящее время я пытаюсь:

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 

И это мой стол код:

<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> 

Но это совсем не так, как я получаю это показывает таблицу (упрощенный вниз)

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) 

Я знаю, что это потому, что я вставил $ gameid, но я не уверен, как получить домой и прочь чай m на идентификатор игры без ссылки на $ gameid на строку.

Есть ли у кого-нибудь предложения?

EDIT Одна из причин, по которой я организующих таблицу, как это происходит потому, что в моей таблице экспрессы, в дополнение к только пари идентификатор и хозяева/гости команда ... У меня также есть один пари и по одному коэффициенту, указанному для каждого набора. Возможно, кто-то лучше понимает отношения с иностранными ключами, которые могут работать лучше и решить эту проблему именно так?

** EDIT # 2 ** Я изменил структуру таблицы DB, но мне все же нужна помощь, отображающая мой стол переднего края правильно!

+1

Ваша структура стола Parlays - плохая конструкция. Имея список, разделенный запятой, и фактическую таблицу первичного ключа комбинации (ParlayID, GameID), и каждая отдельная игра представляет собой свою собственную линию с соответствующей парой. Тогда ваш запрос должен работать. В противном случае вам нужно присоединиться к разрозненным значениям каждого идентификатора Parlay. – DRapp

+0

DRapp ... Я могу понять, что это может быть плохой дизайн. Я определенно открыт для предложений. Не могли бы вы немного расширить свое предложение? Я не совсем понимаю, как я могу это настроить, потому что я не уверен, какие игры будут в павильоне или сколько? Возможно, я просто не понимаю логику этого? –

ответ

2

Ваша основная концепция в порядке, но расположение таблиц должно быть слегка изменено для Parlays. Измените таблицу Parlay на что-то вроде ...

ПЕРЕСМОТР за других элементов, идентифицированных ...

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 

Теперь ваш запрос должен быть идеальным, чтобы идти.

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 

Теперь таблица Parlay может иметь столько игр, сколько вам нужно ... 2 или 200+

НА ПЕРЕСМОТР и дополнительные детали, следующие должны помочь тянущие данных. Я создал образец SQLFiddle для просмотра данных, заполненных и запрошенных, чтобы получить все результаты. Я даже сделал второй запрос, который предварительно форматирует результаты возврата с помощью и содержимого. Может быть, излишний против PHP конкатенации, но просто образец того, что вы МОЖЕТЕ делать.

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; 

Часть кода я попытался стянуть для вас ... немного отличается формата вывода, чем вы хотели. Я сделал двухстрочный контекст. Во-первых, для каждой комнаты, поместите информацию о лицах и ставках. Затем следующая группа всех ставок в пакете. Пожалуйста, ЗАМЕТЬТЕ. Я НЕ ЯВЛЯЕТСЯ разработчиком php, но это следует и должно помочь понять, что я пытаюсь сделать. Я также знаю, что у меня нет информации о «менеджере» в моих примерах таблицы запросов, а имена моих столбцов основаны на моем запросе из SQLFiddle (я не хочу иметь пробелы в именах столбцов).

<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

Я вижу, что вы говорите ... это имеет большой смысл. Я собираюсь работать над реализацией этого кода и вернуться к нему с помощью другого комментария/ответа! –

+0

DRapp ... возможно, у вас также есть предложение для этого. Я оставил часть таблицы, которую у меня есть для таблицы parlays, поскольку я не счел это необходимым для логики, но теперь я не уверен, как ее реализовать. У меня есть одна ставка и единичные коэффициенты, которые предназначены для parlay, а не для отдельных игр как части parlay. Вы знаете, как я могу их реализовать? Возможно, мне нужно добавить еще одну таблицу с этой информацией? –

+0

@RidgeRobinson, добавьте столбцы в таблицу parlay. – DRapp