【问题标题】:How to remove duplicates from stored procedures using mysql如何使用mysql从存储过程中删除重复项
【发布时间】:2016-08-07 07:32:27
【问题描述】:

请检查这些表格。

  • FAMILY 表:FamilyID (pk)、familyName
  • PARENT 表:ParentID (pk)、FamilyID (fk)、用户名、电子邮件、密码
  • KID 表:KidID (pk)、FamilyID (fk)、用户名、电子邮件、密码

以下是从特定姓氏获取父母和孩子的存储过程。这里的数据是从 3 个表中检索出来的。

CREATE DEFINER=`root`@`localhost` PROCEDURE `prc_Dashboard`(IN `inputuserName` VARCHAR(255))
BEGIN
SET @familyID = (SELECT familyID FROM PARENT WHERE userName = inputuserName); 

SELECT  
    F.familyName AS FamilyName, 
    P.userName AS Parents, 
    K.userName AS Kids 
FROM 
    PARENT P 
INNER JOIN 
    FAMILY F ON P.FamilyID = F.FamilyID 
LEFT OUTER JOIN 
    KID K ON K.FamilyID = F.FamilyID
WHERE 
   P.FamilyID = @familyID AND F.FamilyID = @familyID
GROUP BY 
    FamilyName, Parents,Kids;
END

输出应该是

相反,它会创建家庭、父母和孩子的副本,并给我 6 条记录。

【问题讨论】:

  • 向我们展示表格数据。

标签: mysql sql stored-procedures left-join inner-join


【解决方案1】:

您希望将两个列表组合成列。这不是一件非常“相关”的事情。这是可能的,但不能使用join。相反,您可以使用聚合来做到这一点:

select family_name, max(parent) as parent, max(kid) as kid
from ((select family_name, user_name as parent, NULL as kid
              (@rn := if(@f = family_name, @rn + 1,
                         if(@f := family_name, 1, 1)
                        )
               ) as rn
       from family f join
            parents p
            using (familyid) cross join
            (select @f := '', @rn := 0) params
       order by family_name
      ) union all
      (select family_name, NULL, k.user_name,
              (@rnk := if(@fk = family_name, @rnk + 1,
                         if(@fk := family_name, 1, 1)
                        )
               ) as rnk
       from family f join
            kids k
            using (familyid) cross join
            (select @fk := '', @rnk := 0) params
       order by family_name
      ) 
     ) pk
group by family_name, rn;

【讨论】:

  • 你能再检查一下吗...我在来自前端的过程中采用了一个参数。通过使用它,我将获得 familyID @GordonLinoff
  • 我是新手,你能帮我简化一下吗。@GordonLinoff
  • @dpk 。 . .独立运行每个子查询以查看每个子查询的作用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-28
  • 1970-01-01
  • 2018-07-13
相关资源
最近更新 更多