【问题标题】:Mysql Join two tables to check if a user has made a pickMysql 连接两个表以检查用户是否进行了选择
【发布时间】:2017-09-24 16:17:01
【问题描述】:

您好,我正在尝试加入两个 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;

    }
}

我的目的是检查用户是否从 mlb_game_feed 表中选择了获胜者(home_teamaway_team),以及他们是否有,我会将屏幕上的链接从 make_pick 更改为 change_pick(带有 if($count) 语句)。

但是,目前我什至没有取回任何数据,这意味着我的 sql 可能不正确。任何帮助都会很棒!谢谢。

【问题讨论】:

  • FROMJOINON 和 `WHERE 子句之前需要空格。
  • 谢谢....它有效...但是现在我发现我的逻辑不正确。目前只显示两个表中匹配的记录。我的意图是继续显示 mlb_game_feed 表中的所有记录,但根据是否在 user_picks 表中找到匹配记录,将附近的超链接从 make pick 更改为 change pick。我可能使用了错误的 JOIN 类型,因此我将进行更多研究。
  • OT:使用带有 sql 的预处理语句:stackoverflow.com/q/60174/5905665
  • @Strawberry ...感谢您的编辑。但是,您更改了 OP 的原始设置,根据他的评论,这是非结果的主要问题。即使内容包含问题,编辑也不应实质性地改变内容。 OP 和未来的读者不会知道原始问题。可以回滚吗?

标签: php mysql sql join


【解决方案1】:

考虑以下建议:

  1. 使用LEFT JOIN 返回所有记录,并使用条件聚合计算cnt 字段中的匹配项。稍后您可以使用这个 cnt 在 PHP 中运行您的更新超链接。请参阅 fetch 循环中的 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...
      }

    }
}

【讨论】:

    猜你喜欢
    • 2023-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多