我目前正在使用PHP和MySQL构建事件管理系统。我使用会话来管理已登录的用户,该用户当前具有三个表。用户,事件和注释。
想法是,每个事件都有其详细信息(任何人都可以添加事件并对其进行编辑),然后每个用户都有个人注释,只有他们自己才能在“事件的列表”页面上看到。
我为每个用户提供了个人笔记,但是,如果另一个用户为该事件输入了笔记,则会得到该事件的重复输出(重复多次,具体取决于有多少其他用户的笔记)。我知道我的操作方式可能不正确或未标准化,但能帮助我到达那里的任何帮助将不胜感激。
这是MySQL查询:
SELECT
id,
events.event_name,
events.event_date,
events.event_time,
events.event_location,
events.event_price,
events.event_description,
events.event_tickets,
events.event_shared_notes,
notes.event_id,
notes.user_id,
notes.notes_text
FROM events LEFT JOIN notes ON events.id = notes.event_id
WHERE DATEDIFF(event_date,NOW()) >= 0
ORDER BY event_date ASC, event_time ASC;
这是用于将其放入表中的代码片段:
<?php foreach($rows as $row): ?>
<tr>
<td><?php echo $row['id']; ?></td> <!-- htmlentities is not needed here because $row['id'] is always an integer -->
<td><?php echo htmlentities($row['event_name'], ENT_QUOTES, 'UTF-8'); ?></td>
<td><?php echo htmlentities($row['event_date'], ENT_QUOTES, 'UTF-8'); ?></td>
<td><?php echo htmlentities($row['event_time'], ENT_QUOTES, 'UTF-8'); ?></td>
<td><?php echo htmlentities($row['event_location'], ENT_QUOTES, 'UTF-8'); ?></td>
<td> <!-- Your notes -->
<?php
//Checks for comments by the current user (ID)
if ($row['user_id'] == $get_current_user_id) {
echo htmlentities($row['notes_text'], ENT_QUOTES, 'UTF-8');
}
else { //no notes, empty display
} ?>
</td>
<?php endforeach; ?>
最后是一个看起来如何输出的示例:
最佳答案
我认为,如果您尝试描绘理想结果集的外观,您会发现events
表中必须存在重复的行,因为它与notes
有一对多的关系。我看到的唯一选择是:
对notes
(例如COUNT
,SUM
)中的行运行聚合函数,并按事件ID进行分组,而不是返回每一行。这似乎不适用于您的情况。
保持查询不变,并让您的客户端代码知道在迭代结果集时事件ID何时更改。
在代码中执行联接逻辑。因此,您将首先针对events
运行单个查询,然后针对每个结果,针对notes
运行另一个查询以查找具有匹配事件ID的注释。