【问题标题】:mysql : Don't show duplicate result on SELECTmysql:不要在 SELECT 上显示重复的结果
【发布时间】:2017-02-10 23:05:20
【问题描述】:

第三个选择显示结果与前两个选择的结果重复。 所以可以说我的数据集只有 5 个 id。 前两个语句产生 ids 1,2,3 enabled = 1 我需要的最后一条语句 ids 4,5 enabled = 0

但是现在我启用了 1,2,3,4,5 的 ID = 1 加上 1,2,3,4,5 的启用 = 0

SELECT p.*, 1 as enabled
    FROM member_permissions mp
    JOIN permissions p ON p.permission_id = mp.permission_id
    WHERE member_id = 1
UNION
    SELECT pgp.*, 1 as enabled
    FROM member_permissions mp
    JOIN permission_link pl ON pl.permission_group_id = mp.permission_group_id
    JOIN permissions pgp ON pgp.permission_id = pl.permission_id
    WHERE member_id = 1
UNION
    SELECT *, 0 as enabled
    FROM permissions p

【问题讨论】:

  • 我看不到最终 UNION/SELECT 的意义。它一定会产生您所抱怨的输出。
  • GROUP BY 是你要找的...
  • 最终选择的重点是生成前2次选择中未显示的剩余数据。那么我应该怎么做才能产生我需要的剩余数据?
  • @robWood 我应该把 GROUP BY 放在哪里?
  • 副手,我想你可以只在最后贴一个,但你可能需要将它包装在另一个查询中并按结果分组。 stackoverflow.com/questions/7640396/…

标签: mysql sql


【解决方案1】:

不幸的是,您必须执行两次顶级查询才能将它们从较低的查询中删除:

SELECT p.*, 1 as enabled
    FROM member_permissions mp
    JOIN permissions p ON p.permission_id = mp.permission_id
    WHERE member_id = 1
UNION
    SELECT pgp.*, 1 as enabled
    FROM member_permissions mp
    JOIN permission_link pl ON pl.permission_group_id = mp.permission_group_id
    JOIN permissions pgp ON pgp.permission_id = pl.permission_id
    WHERE member_id = 1
UNION
    SELECT *, 0 as enabled
    FROM permissions p where p.permission_id not in (
      SELECT p.permission_id
          FROM member_permissions mp
          JOIN permissions p ON p.permission_id = mp.permission_id
          WHERE member_id = 1
      UNION ALL
      SELECT pgp.permission_id
          FROM member_permissions mp
          JOIN permission_link pl ON pl.permission_group_id = mp.permission_group_id
          JOIN permissions pgp ON pgp.permission_id = pl.permission_id
          WHERE member_id = 1
   )

【讨论】:

    【解决方案2】:

    在这种情况下,您可以尝试使用左连接。

    SELECT DISTINCT
           prm.*,
           CASE
             WHEN mp.member_id IS NULL OR mp2.member_id IS NULL THEN 0
             ELSE 1
           END AS ENABLED
      FROM permissions prm
      LEFT JOIN member_permissions mp
             ON mp.permission_id = prm.permission_id
            AND mp.member_id = 1
      LEFT JOIN permission_link pl
             ON pl.permission_group_id = prm.permission_group_id
      LEFT JOIN member_permissions mp2
             ON mp2.permission_group_id = pl.permission_group_id
            AND mp2.member_id = 1
    

    不是我认为的最佳解决方案,但它可能有效

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-19
      • 2011-02-09
      • 1970-01-01
      • 2014-02-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多