我正努力让人们可以注册参加活动并查看所有活动,但是如果他们查看活动页面我不想显示他们已经为其注册的活动将它们排除在外。
我将人们注册的事件存储在名为的表中 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>
<?
}
?>
关于如何排除用户已注册的事件的任何想法?
答案 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的tournaments
和tournament_registration
的结果,该用户ID应该是指定用户注册的锦标赛/事件列表对于。
note - 您希望通过特定的事件ID或特定的用户ID进一步限制此查询,具体取决于您希望在视图中迭代此数据的方式。< / p>