【问题标题】:Select row based on identifier and value from another row根据另一行的标识符和值选择行
【发布时间】:2023-03-07 22:17:02
【问题描述】:

我有一个如下所示的 mySQL 数据集:

ID    PARENT_ID    VALUE

1     100          This comment should be approved
2     100          Y
3     101          Another approved comment
4     101          Y
5     102          This comment is not approved
6     102          N

我需要构造一个 SQL 查询来选择具有匹配 parent_id 和相应值 Y 的行(但忽略结果中具有单个字母作为值的行)以产生:

ID    PARENT_ID    VALUE

1     100          This comment should be approved
3     101          Another approved comment

我的想法是使用GROUP BY 组合列,但我不知道如何根据 Y/N 值进行选择。

How do I select a row based on a priority value in another row? 这里可能有一个解决方案,但我不认为它问的是完全相同的问题。

有什么想法吗?

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    虽然您可以将其表示为聚合,但您可以使用exists 来表示:

    select d.*
    from dataset d
    where d.value <> 'Y' and
          exists (select 1
                  from dataset d2
                  where d2.parent_id = d.parent_id and d2.value = 'Y'
                 );
    

    这个版本可能效率更高。

    【讨论】:

    • 正如 Nick 指出的那样,这在性能方面更好,但我的 SQL 实际上是更大查询的一部分,这使得这种技术变得困难。对于大多数用例来说,这可能是更好的解决方案。
    • 在对我的完整查询进行了一些更新后,我设法整合了这种方法,因此更新为首选答案。
    【解决方案2】:

    首先,如果可能,请更改您的表架构。您的表在同一字段中存储了两种数据(是的,没有标志和 cmets)。这打破了常态,以后会困扰你。

    但如果不是您要更改的表,您将需要自行加入。试试这个。

       SELECT a.id, a.parent_Id, a.value 
       FROM table a inner join table b
       ON a.parent_id =b.parent_id
        WHERE a.value <> 'Y' and b.value ='Y'
    

    【讨论】:

    • 不幸的是,表模式不是我要更新的。我曾尝试将表加入自我,但由于我的 WHERE 语句不正确,它没有起作用。这个解决方案效果很好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-09
    • 2013-02-21
    • 1970-01-01
    • 2017-02-21
    • 1970-01-01
    相关资源
    最近更新 更多