如何通过分组两列来防止重复? MYSQL/Codeigniter

Posted

技术标签:

【中文标题】如何通过分组两列来防止重复? MYSQL/Codeigniter【英文标题】:How to prevent duplicate through grouping two columns? MYSQL/Codeigniter 【发布时间】:2015-10-28 14:46:44 【问题描述】:

我有一个困境,我正在尝试制作一个 facebook 风格的墙,其中你有墙桌、用户桌、墙贴表和图像表(对于这种情况)。为简化流程,将图像张贴在图像表中,并将条目设置为墙贴。它按墙 ID 分组,但是当创建 cmets 时,它会为每个新评论重复墙帖。本质上,我只希望每个墙贴一个帖子。

MYSQL 查询(Codeigniter):

    $this->db->select('*');
    $this->db->from('wall_posts AS p');
    $this->db->join('users AS k', 'p.wall_poster = k.user_id AND p.wall_owner = k.user_id', 'left');
    $this->db->group_by('p.wall_id');
    $this->db->where('p.wall_poster', $pid); // $pid = given user id
    $this->db->or_where('p.wall_owner', $pid);
    $this->db->order_by('p.wall_id', 'desc');
    $this->db->limit($lim); // $lim = limit number

    return $this->db->get();

表格示例

    wall_id|owner_id|reference_id|wall_poster
    1      |0        |55         | 2
    2      |0        |30         | 1
    3      |0        |32         | 2
    4      |2        |19         | 3
    5      |0        |0          | 4
    6      |0        |0          | 2
    7      |0        |32         | 3
    8      |0        |18         | 4

现在,您可以看到 ID 3 和 ID 7 具有相同的 reference_id(本例中为图像),因此稍后显示结果时,任何引用该图像的帖子将显示多次而不是仅显示一次。我还有一个名为 post_type 的列,用于在控制器中确定它是否是普通帖子、评论、图像帖子、图像评论等...

提前致谢!这一直困扰着我,如果可能的话,我想将其保留为单个查询。

【问题讨论】:

【参考方案1】:

您可以尝试select distinct,但您需要将范围缩小到该字段。换句话说,尝试这样的事情:

已针对 distinct() 的 codeigniter 方法进行了编辑

$this->db->distinct();
$this->db->select ('reference_id');
$this->db->from('wall_posts AS p');
$this->db->join('users AS k', 'p.wall_poster = k.user_id AND p.wall_owner = k.user_id', 'left');
$this->db->group_by('p.wall_id');
$this->db->where('p.wall_poster', $pid); // $pid = given user id
$this->db->or_where('p.wall_owner', $pid);
$this->db->order_by('p.wall_id', 'desc');

你也可以试试:

$this->db->select('DISTINCT(reference_id)');

【讨论】:

谢谢,我会学习 distinct 并尝试一下。会告诉你它是否有效:) 很抱歉,我尝试了许多不同的 select('distinct', 'column') 和 distinct('column') 变体,但似乎都没有。谷歌搜索结果并不多,但那些谈论它的人声称 distinct 至少对于 codeigniter 来说是相当错误的。 不要将distinct 放在引号中。它在普通 sql 中的工作方式是这样的:select distinct reference_id 或者你可以在reference_id 上加上反引号。但是,根据这个:***.com/a/656710/3044080 在 codeigniter 中,它的工作方式可能会有所不同。我会编辑我的答案 感谢您的回复,但它没有返回任何结果,大概是因为 select('reference_id') 只指定了 reference_id 而不是 ('*')。但是让它全选并不会改变结果,并且在 group_by 之前放置 distinct 作为另一个答案建议什么也没做。请注意,我确实添加了加入别名。我正在回顾逻辑,它似乎很好。有什么想法吗? 非常感谢您对迟到的回复感到抱歉。在考虑了您所说的之后,我意识到我真正需要的只是一个 parent_id 列来对所有内容进行排序,因为显然没有它,新消息与原始消息毫无关系。我在另一个测试页面上进行了不同的测试,它就像你说的那样工作。非常感谢,这是一次很棒的学习经历:)

以上是关于如何通过分组两列来防止重复? MYSQL/Codeigniter的主要内容,如果未能解决你的问题,请参考以下文章

如何按id python按一列顺序对两列进行分组[重复]

通过使用可能的数组在 awk 中以困难模式分析两列来计数

wps如何突出显示两列数据的重复项,而同列中重复数据不突出显示?

通过使用 HDFStore 比较列来选择行

Laravel:如何通过选择两列进行分组具有不同的值

Hibernate 标准:如何通过连接的两列排序?