【问题标题】:MySQL choose one field in duplicated valuesMySQL在重复值中选择一个字段
【发布时间】:2019-04-06 02:35:18
【问题描述】:

我有一个用户权限表。 这些权限可以是写入或读取。我有一个合并 profile_user 表和 right_user 表的 SQL 视图。这个观点给了我以下结果:

+-------+-----------+---------------+
| email | right     | write_or_read |
+-------+-----------+---------------+
| admin | dashboard | write         |
+-------+-----------+---------------+
| admin | dashboard | read          |
+-------+-----------+---------------+
| admin | log       | read          |
+-------+-----------+---------------+

如何取消重复 dashbord 写入以仅获取最重要的(写入权限)。 我想写一个 SQL 查询给我以下结果:

+-------+-----------+---------------+
| admin | dashboard | write         |
+-------+-----------+---------------+
| admin | log       | read          |
+-------+-----------+---------------+

我阅读了this question,但答案仅涵盖 id 数字字段以获得正确的记录。

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    在这种情况下,一个简单的max() 可以工作:

    select email, right, max(write_or_read)
    from user_rights
    group by email, right;
    

    【讨论】:

    • 哇...原来如此简单...谢谢 :)
    • 此选项目前有效,但不是非常可扩展。它仅在“权利”碰巧总是按字母倒序排列时才有效。
    • 让我换个说法……如果“权利”的优先级总是按字母倒序排列。
    • 是的,谢谢您的建议。我会注意不要将它与其他术语一起使用。
    • @drakin8564 。 . .此示例中只有两个“权限”,因此 min() 或 max() 都可以使用。因此,这似乎是最简单和最好的解决方案。对于多个字符串,将使用不同的方法。
    【解决方案2】:

    您可以使用CASE 表达式来优先列出条件。这也适用于两个以上的值:

    SELECT email, right, CASE
        WHEN SUM(write_or_read = 'write') > 0 THEN 'write'
        WHEN SUM(write_or_read = 'read')  > 0 THEN 'read'
        -- more conditions
    END AS permission
    FROM t
    GROUP BY email, right
    

    【讨论】:

    • 谢谢,这是一个非常干净的答案。
    猜你喜欢
    • 2012-12-24
    • 2014-01-19
    • 2013-10-31
    • 1970-01-01
    • 2012-03-30
    • 1970-01-01
    • 1970-01-01
    • 2020-07-27
    • 2017-09-05
    相关资源
    最近更新 更多