我目前正在使用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; ?>
最后一个关于它看起来如何输出的例子:
答案 0 :(得分:1)
我认为如果您尝试描绘理想结果集的外观,您会发现events
表中必须存在重复的行,因为它与{{notes
表有一对多的关系1}}。我看到的唯一选择是:
对来自notes
的行(例如COUNT
,SUM
)运行聚合函数,按事件ID分组,而不是返回每一行。这似乎不适用于您的情况。
按原样保留您的查询,并在迭代结果集时让您的客户端代码知道事件ID何时发生变化。
在代码中执行连接逻辑。因此,您首先针对events
运行单个查询,然后针对每个结果,针对notes
运行另一个查询以查找具有匹配事件ID的注释。
答案 1 :(得分:0)
这些重复的行是此事件的其他用户注释 - 您只需跳过显示它们。直接在查询中过滤(等效于WHERE ... AND notes.user_id = {$get_current_user_id}
无需在循环中比较(也不选择)user_id。另一方面,如果在没有添加此用户的评论时notes_text为NULL(因此LEFT JOIN
我已经过时),则需要将其替换为空字符串。