【问题标题】:Using DISTINCT in a joined subquery in MySQL在 MySQL 的连接子查询中使用 DISTINCT
【发布时间】:2021-02-10 18:31:25
【问题描述】:

这是这个问题的小提琴:http://sqlfiddle.com/#!9/0569eb/1

我有一个 cmets 表,回复存储在同一个表中,如下所示。

CREATE TABLE IF NOT EXISTS `comments` (
  `id` int(6) unsigned NOT NULL,
  `parent` int(3) unsigned NOT NULL,
  `posted_by` int(3) unsigned NOT NULL,
  `comment` varchar(200) NOT NULL,
  `sort` int(3) NOT NULL,
  PRIMARY KEY (`id`),
  INDEX (`parent`),
  INDEX (`posted_by`),
  INDEX (`sort`)
  
) DEFAULT CHARSET=utf8;
INSERT INTO `comments` (`id`, `parent`, `posted_by`, `comment`, `sort`) VALUES
  ('1', '0', '1', 'Here is a comment by user 1', '5'),
  ('2', '1', '2', 'Here is a reply by user 2', '5'),
  ('3', '1', '3', 'Here is a reply by user 3', '5'),
  ('4', '1', '2', 'Here is a reply by user 2', '5'),
  ('5', '0', '2', 'Here is a comment by user 2', '2'),
  ('6', '0', '5', 'Here is a comment by user 5', '3');

我需要能够选择用户发布的主要 cmets,或者让同一用户发布回复。以下是我想出的为用户 2 获取适当数据的方法。

由于一条评论可以有多个回复,因此我在子查询中使用 DISTINCT 以每行仅获得一个回复。这是一个合适的解决方案,还是有更好的方法来处理这种情况?

SELECT
  c.id,
  c.comment
FROM comments c
  LEFT JOIN (SELECT DISTINCT comments.parent FROM comments WHERE comments.posted_by = 2) r ON r.parent = c.id
WHERE 
  (
    c.posted_by = 2
    OR r.parent IS NOT NULL
  )
  AND c.parent=0
ORDER BY c.sort DESC;

以下是与用户 2 相关的 cmets 的预期输出

【问题讨论】:

  • 不聚合的分组方式与选择不同的方式相同。 PS请在考虑发布问题之前进行研究。如果您想优化、学习和应用基础知识并报告发现,这表明没有研究。特别是阅读索引的基础知识。 PS 索引默认顺序是升序。
  • 您好,您能否根据您提供的数据发布您预期的输出行。
  • @MarkB 当然!更新了我的问题。
  • use text, not images/links, for text--including tables & ERDs。转述或引用其他文本。只提供您需要的东西并将其与您的问题联系起来。仅将图像用于无法表达为文本或增强文本的内容。在图像中包含图例/键和说明。 PS minimal reproducible example PS 当没有重复行时,x join y where c or d is x join y where c union x join y where d。你可以谷歌重新那个。 (了解有关使用“站点:”进行谷歌搜索的信息。) PS 通常,工程中没有“最佳”,请根据您的情况进行衡量。 PS 研究?
  • 不清楚您所说的“这种情况”究竟是什么意思。这个特殊的代码?哪一部分?从某种意义上说是这样的代码......?

标签: mysql join group-by


【解决方案1】:

已编辑:消除对 cme​​ts 中建议的结果进行排序的需要

您的解决方案没有问题,它可以工作并且尽可能简洁。

作为替代方案(但不是更好),您可以使用 UNION

SELECT id, comment 
FROM (
    SELECT 
        c.id, 
        c.comment,
        c.sort
    FROM comments c
    WHERE posted_by = 2 AND parent = 0
    UNION
    SELECT DISTINCT
        c.id, 
        c.comment,
        c.sort
    FROM comments c
        JOIN comments p ON p.parent = c.id 
    WHERE p.posted_by = 2) x
ORDER BY sort DESC;

【讨论】:

  • 我还没有查看问题查询或其修改版本是否应该留在任何地方加入。但我很漂亮,他们应该是。
  • UNION 中的第二个 SELECT 仅适用于有父行的行,因此连接是 INNER JOIN
猜你喜欢
  • 1970-01-01
  • 2015-09-26
  • 1970-01-01
  • 2011-11-25
  • 2020-12-29
  • 1970-01-01
  • 2013-02-12
  • 2012-08-31
相关资源
最近更新 更多