2016-06-22 15 views
1

SELECTクエリから正しい情報を出力するのが難しいです。これらは私が引っ張っているテーブルです。これらHOME_TEAMとaway_team IDのは、最大一致PHP MySQL複合結合

ゲーム

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

id name 
1  Team A 
2  Team B 
3  Team C 

さらに

TEAMS、私が持っている

私は、ゲームのリストを持っていますparlaysテーブルとパーレーゲーム。 Parlay Gamesはparlaysテーブルを参照します。

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) 

私はそれが理にかなって願っています。私はちょうどパレイIDと、各家庭と離れたチームの名前をパレイにしたい。

これは私が現在しようとしています私の選択クエリです:

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を挿入したためだと知っていますが、私は家庭や紅茶を手に入れる方法がわかりません行ごとに$ gameidを参照することなく、ゲームIDごとに名前を付けます。

誰か提案はありますか?私parlaysテーブルで、ほかにちょうどパーレイIDとホームチーム/アウェイチームが...私は、1つの賭けを持っているとし、ので、私はこのようなテーブルを組織していた理由の

EDIT 一つは、各セットごとに1つのオッズが列挙されています。おそらく誰かが、より良く機能し、このようにこの問題を解決することができる外部キーの関係について、より良い考えを持っているでしょうか?

** EDIT#2 ** 私はDBテーブル構造を変更しましたが、フロントエンドテーブルを正しく表示するためにはまだ助けが必要です。

+1

Parlaysのテーブル構造は悪いデザインです。コンマで区切られたリストと、(ParlayID、GameID)のコンビネーションプライマリキーの実際のテーブルとを比較し、それぞれのゲームを対応するパレイとの独自のラインとして持つ。それからあなたの質問は機能するはずです。さもなければ、各パレイIDの分解された値に加わる必要があります。 – DRapp

+0

DRapp ...これは悪いデザインかもしれないことがわかります。私は確かに提案に開放されています。あなたの提案をもう少し拡張してもよろしいですか?私はそれをどのように設定することができるのかよく分かりません。なぜなら、どのゲームがパーレーになるのか、どれくらいのゲームがあるのか​​分からないからです。おそらく、私はこの背後にある論理を理解していないだけだろうか? –

答えて

2

あなたの主なコンセプトはOKですが、テーブルのレイアウトはParlays用に少し変更する必要があります。 ...何かのように同定された他の項目ごとに

REVISION ...今

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 

をお使いのParlayテーブルを変更して、あなたのクエリが行っても完璧でなければなりません。

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 

あなたが必要として今、パーレイテーブルはできるだけ多くのゲームを持つことができます... 2または200 +

PERの改訂および追加の詳細については、以下のデータを引っ張って助けなければなりません。 すべての結果を取得するために、データを表示し、読み込まれクエリされたSQLFiddleサンプルを作成しました。私は2番目のクエリを実行して、返された結果をそのコンテンツとあらかじめフォーマットしています。 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; 

私は...あなたのために一緒にあなたが望んでいたよりもわずかに異なる出力レイアウトを引くしようとしたいくつかのコード。私は2列の文脈を作りました。まず、各パレイに対して、人と賭けの情報を入れます。次に、パレイ内のすべてのベットの次のグループ。注意してください。私は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 ...おそらくこれについての提案もあります。ロジックのために必要なものが見つからなかったので、私はパーレイテーブルのテーブルの一部を中断しましたが、今は実装方法がわかりません。 私は1つの賭け金と1つの賭け金を持っていますが、賭け金の一部として個々のゲームではありません。私はこれらをどのように実装できるか知っていますか?おそらく私はその情報を持つ別のテーブルを追加する必要がありますか? –

+0

@RidgeRobinson、列をパレイテーブルに追加します。 – DRapp