具有连接表和用户标识的重复数据输出行

时间:2014-06-29 16:59:57

标签: php mysql sql

我目前正在使用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; ?> 

最后一个关于它看起来如何输出的例子: duplicate rows

2 个答案:

答案 0 :(得分:1)

我认为如果您尝试描绘理想结果集的外观,您会发现events表中必须存在重复的行,因为它与{{notes表有一对多的关系1}}。我看到的唯一选择是:

  1. 对来自notes的行(例如COUNTSUM)运行聚合函数,按事件ID分组,而不是返回每一行。这似乎不适用于您的情况。

  2. 按原样保留您的查询,并在迭代结果集时让您的客户端代码知道事件ID何时发生变化。

  3. 在代码中执行连接逻辑。因此,您首先针对events运行单个查询,然后针对每个结果,针对notes运行另一个查询以查找具有匹配事件ID的注释。

答案 1 :(得分:0)

这些重复的行是此事件的其他用户注释 - 您只需跳过显示它们。直接在查询中过滤(等效于WHERE ... AND notes.user_id = {$get_current_user_id} 无需在循环中比较(也不选择)user_id。另一方面,如果在没有添加此用户的评论时notes_text为NULL(因此LEFT JOIN我已经过时),则需要将其替换为空字符串。