2017-09-24 60 views
0

您好我正在尝试加入两个MySQL表。这些表如下:Mysql加入两个表来检查用户是否已经选择了

Table 1 
Name: mlb_game_feed 
Fields: game_feed_game_id, date, home_team, away_team 

Table 2 
Name: user_picks 
Fields: pick_id, game_feed_game_id_fk, user_id_fk 

这里是我已经尝试使用它来加入两个表的SQL:

$sql = " 
SELECT game_feed_game_id 
    , home_team 
    , away_team 
    , COUNT(1) as cnt 
    FROM game_feed_mlb 
    JOIN user_picks 
    ON user_picks.game_feed_game_id_fk = game_feed_mlb.game_feed_game_id 
Where game_feed_mlb.date = '" . $_SESSION['date']."' 
    AND user_picks.user_id_fk = 1"; 

$result = mysqli_query($conn, $sql); 

if (mysqli_num_rows($result) > 0) { 

    // output data of each row   
    while($row = mysqli_fetch_assoc($result)) { 

     $count = $row["cnt"]; 
     $game_id = $row["game_feed_game_id"]; 
     $home_team = $row['home_team']; 
     $away_team = $row['away_team']; 

     echo $game_id; 

    } 
} 

我的目的是检查用户是否选择了一个冠军(无论是HOME_TEAM或从mlb_game_feedAWAY_TEAM),如果他们有,我会从make_pick更改链接到change_pick(与if($count)语句)在屏幕上。

但是,目前我甚至没有收到任何数据,这意味着我的sql可能不正确。任何帮助将是伟大的!谢谢。

+0

你的'FROM','JOIN','ON'和'WHERE子句前需要空间。 – Parfait

+0

谢谢....它的作品...但是现在我看到我的逻辑是不正确的。目前只显示两个表中匹配的记录。我的意图是继续显示mlb_game_feed表中的所有记录,但根据在user_picks表中是否找到匹配的记录,将附近的超级链接从make pick更改为pick。我可能使用了错误类型的JOIN,所以我会做更多的研究。 –

+0

OT:使用SQL准备语句:https://stackoverflow.com/q/60174/5905665 –

回答

0

考虑以下建议:

  1. 使用LEFT JOIN返回所有记录和条件汇总在CNT场数匹配。稍后,您可以使用此cnt在PHP中运行更新超链接。请参见取回循环中的if块。
  2. 如前所述,在换行符上连接的SQL字符串在SQL的子句之前不留空间:FROMJOINONWHERE
  3. 对于您的聚合查询使用GROUP BY子句。非聚合列必须出现在这个子句中否则它违反了ANSI SQL。不幸的是,MySQL允许ONLY_FULL_GROUP_BY模式关闭,而其他每个RDBMS都会正确地引发错误。
  4. 使用表别名代替更多可读代码而不是重复长名称表。
  5. 传入$SESSION日期作为准备语句的参数。请参阅?字符串中的占位符。

PHP

$sql = "SELECT g.game_feed_game_id, g.home_team, g.away_team, " . 
     "  SUM(CASE WHEN g.game_feed_game_id IS NOT NULL " . 
     "    THEN 1 ELSE 0 END) as cnt " . 
     "FROM game_feed_mlb g " . 
     "LEFT JOIN user_picks u " . 
     " ON u.game_feed_game_id_fk = g.game_feed_game_id " . 
     "WHERE g.`date` = ? AND u.user_id_fk = 1 " . 
     "GROUP BY g.game_feed_game_id, g.home_team, g.away_team;" 

// CONFIGURE PREPARED STATEMENT AND BIND PARAMETER 
$stmt = $mysqli->prepare($sql); 
$stmt->bind_param("s", $_SESSION['date']); 

// EXECUTE STATEMENT AND RETURN RESULTS 
$stmt->execute(); 
$result = $stmt->get_result(); 

if (mysqli_num_rows($result) > 0) { 

    // output data of each row   
    while($row = $result->fetch_assoc()) { 

     $count = $row["cnt"]; 
     $game_id = $row["game_feed_game_id"]; 
     $home_team = $row['home_team']; 
     $away_team = $row['away_team']; 

     echo $game_id; 

     if($row['cnt'] > 1) { 
     // change links accordingly... 
     } 

    } 
} 
相关问题