我目前正在使用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(例如COUNTSUM)中的行运行聚合函数,并按事件ID进行分组,而不是返回每一行。这似乎不适用于您的情况。
保持查询不变,并让您的客户端代码知道在迭代结果集时事件ID何时更改。
在代码中执行联接逻辑。因此,您将首先针对events运行单个查询,然后针对每个结果,针对notes运行另一个查询以查找具有匹配事件ID的注释。

10-04 15:53
查看更多