PHP/MySQL - 需要帮助获取用户适用的事件列表

标签 php mysql

我需要一些帮助 - 我有两张 table :

  • 事件(eventID、event_name、event_description) - 用于存储
    有关不同事件的信息
  • events_applied (eventID, userID, date_applied) - 用于跟踪哪些用户应用了哪些事件

当用户登录应用程序时,他应该只看到他可以应用的事件,或者更准确地说,那是他尚未应用的事件。应用的事件应该被隐藏。所有内容都应打印在表格中,并附有应用程序的链接。

目前,我的代码如下所示:

$sql = "SELECT * FROM events";
if($stmt = $mysqli->prepare($sql)) { 
    $stmt->execute(); 
    $stmt->store_result(); 
    $num_of_rows = $stmt->num_rows; 
    $stmt->bind_result($eventID, $event_name, $event_description);

    echo '<table> 
            <thead> 
            <tr> 
            <th>Event #</th> 
            <th>Event name</th> 
            <th>Event description</th> 
            <th>Apply</th> 
            </tr> 
            </thead> 
            <tbody>'; 
    while ($stmt->fetch()) { 
        echo '<tr> 
        <td>'.$eventID.'</td> 
        <td>'.$event_name.'</td> 
        <td>'.$event_description).'</td> 
        <td><a href="event_apply.php?eventID='.$eventID.'&userID='.$userID.'">Apply</a></td>
        </tr>'; 
    } 
}

问题是,这将打印出所有事件,但我需要删除每个用户的“已应用于”事件,或者(更好)-打印出已应用的事件,而不是打印“应用”链接”,我会打印出“抱歉,您已经申请了此事件。

我怎样才能做到这一点?我在想,也许在 while 循环中我可以这样做 $sql = "SELECT DISTINCT eventID FROM events_applied WHERE userID = ?"; 但看起来有点困惑:/

编辑/新信息 我使用“max_people”参数扩展了“events”表 - 这样我就可以限制报名参加每个事件的人数。

如何修改代码以便不显示已满的事件?

这是当前有效的答案:

SELECT e.*
FROM events e
LEFT JOIN events_applied ea
    ON ea.eventID = eID.eventID AND ea.userID = :userID
WHERE ea.eventID IS NULL

我尝试添加另一个 WHERE,如下所示: AND (SELECT COUNT (userID) FROM events_applied WHERE eventID = :eventID

问题是我不知道如何获取 eventID 作为变量 - 我正在使用 while 循环打印出所有事件,但在此之前我需要这个变量,对吗?

最佳答案

这看起来是 LEFT JOIN 反模式的一个很好的用例:

SELECT e.*
FROM events e
LEFT JOIN events_applied ea
    ON ea.eventID = euserID.eventID AND ea.userID = :userID
WHERE ea.eventID IS NULL

其中 :userID 是当前连接的用户的 ID。

此查询选择所有事件并执行LEFT JOIN 以连接到当前用户申请的事件。然后,WHERE 子句消除匹配的事件。因此,您确实会获得当前用户尚未应用的所有事件。

关于PHP/MySQL - 需要帮助获取用户适用的事件列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58053752/

相关文章:

php - 在 yii2 中显示多个相关数据

mysql - 处理 NULL 值的智能查询

mysql - 获取带有 EST 时区时间的游戏

php - 命令行 MySQL 脚本

使用 PHP 分页时 MySQL 大表性能问题

php - MySQL:查询另一个查询结果并返回两个结果?

php - 如何在计算最多行的同时加入 SQL 表?

php - 哪些 php 框架最适合与 Cassandra 等 NoSQL 数据库一起使用?

php - 登录系统[php + mysql]

php - ZendFramework - 如何通过我的 HtmlTag 装饰器的标签将我的标签也包装在里面