如果已经为其注册,则排除事件

时间:2018-06-05 18:03:14

标签: php mysql

我正努力让人们可以注册参加活动并查看所有活动,但是如果他们查看活动页面我不想显示他们已经为其注册的活动将它们排除在外。

我将人们注册的事件存储在名为的表中 tournament_registration

在此表中它存储了tournamentid,它们的用户名,名字,姓氏,电话号码。

和活动详情 锦标赛

我可以从锦标赛数据库中选择所有赛事详情。

这是我到目前为止所拥有的。

 <?php
$stmt = $DB_con->prepare('SELECT * FROM tournaments');
$stmt->execute();
while ($row = $stmt->fetch(PDO::FETCH_ASSOC))
{
    ?>      

                    <!-- OVERVIEW -->

                <div class="panel panel-headline">
                                <div class="panel-heading">
                                    <h3 class="panel-title">  <? echo $row['tournament_name']; ?></h3>
                                    <p class="panel-subtitle">
                                    Event Date: <? echo $row['tournament_date'];?>
                                    <br>
                                     Event Start time: <? echo $row['tournament_time'];?>
                                     <br>
                                     Event Entry Fee: 
                                     <? echo $row['entryfee'];?>
                                    </p>
                                </div>
                                <div class="panel-body">
                                    <h4>Panel Content</h4>
                                    <p>
                                     <? echo $row['tournament_desc'];?>

                                    </p>
                                    <a href="signup.php?do=<?php echo $row['tournamentid'];?>"><button type="button" class="btn btn-primary btn-block">Register for this event </button></a>

                                </div>
                            </div>


<?
}
?> 

关于如何排除用户已注册的事件的任何想法?

2 个答案:

答案 0 :(得分:2)

我们可以排除SQL查询中的行。

取代SELECT * FROM tournaments

我们可以使用具有反连接模式的查询:

SELECT t.tournament_date
     , t.tournament_time
     , t.entryfee
     , t.tournament_desc
     , t.tournamentid
  FROM tournaments t
    -- anti-join
  LEFT
  JOIN tournament_registration r
    ON r.tournamentid = t.tournamentid
   AND r.user_id = ?
 WHERE r.tournmaentid IS NULL
 ORDER
    BY ...

- 或 - a not exists pattern

SELECT t.tournament_date
     , t.tournament_time
     , t.entryfee
     , t.tournament_desc
     , t.tournamentid
  FROM tournaments t
 WHERE NOT EXISTS ( SELECT 1 
                      FROM tournament_registration r
                     WHERE r.tournamentid = t.tournamentid
                       AND r.user_id = ?
                  )
 ORDER
    BY ...

我们需要传入user_id的值。

$stmt->execute($user_id);

将提供值以代替查询文本中的?问号占位符。

或者我们可以在SQL文本中使用命名占位符

   AND r.user_id = :registered_user

在准备好之后,在执行之前,我们可以做bindValue

  $stmt->bindValue(':registered_user',$user_id);   

然后执行。

不需要对代码进行其他更改。

答案 1 :(得分:0)

如果您已经拥有&#34;关系&#34;已经使用tournament_registration表构建,然后您可以使用查询语句过滤掉这些用户。

$stmt = $DB_con->prepare('SELECT * FROM tournaments');可能会像:

$sql = 'SELECT * FROM 
          tournaments as t, 
          tournament_registration as tr 
        WHERE 
          t.userid = tr.userid';
$stmt = $DB_con->prepare($sql);

在此示例中,隐式联接仅返回共享相同用户ID的tournamentstournament_registration的结果,该用户ID应该是指定用户注册的锦标赛/事件列表对于。 note - 您希望通过特定的事件ID或特定的用户ID进一步限制此查询,具体取决于您希望在视图中迭代此数据的方式。< / p>