【问题标题】:mySQL showing rows that have multiple occurences of common attributesmySQL 显示具有多次出现的公共属性的行
【发布时间】:2017-04-18 01:23:49
【问题描述】:

我在以特定方式显示数据时遇到了一些问题。

我想展示 3 个或更多技能共有的机制。

我不确定如何计算常用技能,我尝试使用 EXIST 和子查询但无法弄清楚。

这是我必须显示所有具有他们技能的机械师的查询

Select distinct fName, lName , Skill  from Person 
inner join Worker on Person.personID = Worker.personID
inner join Mechanic on Worker.personID = Mechanic.personID
inner join Skills on Mechanic.personID = Skills.personID
order by fName

哪个显示

fName   lName   Skill
----------------------------
Carl    Marx    fuel systems
Jimmy   John    heating and cooling systems
Jimmy   John    exhaust systems
Jimmy   John    fluid and filter service
Mike    Hawk    resurface rotors and drums
Mike    Hawk    struts and suspension
Mike    Hawk    engine performance (tune-up)
Mike    Hawk    wheel alignment
Ricky   Bobby   wheel alignment
Ricky   Bobby   resurface rotors and drums
Ricky   Bobby   A/C systems
Ricky   Bobby   struts and suspension
Ricky   Bobby   heating and cooling systems
Terry   Cruz    sound systems
Terry   Cruz    cruise control

输出应该是

Ricky   Bobby
Mike    Hawk

这是关系方案

提前致谢!让我知道我是否可以提供其他任何东西

【问题讨论】:

  • 我们需要更多关于显示的信息。因为如果{A,B} 有 3 个共同技能和 {A, C } 不同技能但也有 3 个技能,你的显示是什么?
  • 嗯,我不确定我明白你在问什么,我只是想说明哪些机械师有共同的技能。如果 A 和 C 有 3 个技能但只有 1 个共同点,则什么都不会显示。 A 和 C 必须有 3 个共同的技能。如果 A 和 B 有 3 个共同技能,A 和 C 有 3 个共同技能,但 B 和 C 没有共同技能,则应该显示 A、B 和 C,因为他们至少与另一个人有 3 个共同点
  • 根据你的例子,Jimmy John 和 Ricky bobby 没有任何共同的技能;并且根据您的要求,您需要一个查询来输出具有相同技能的机制,对吗?
  • 对不起,你说得对,他们没有共同技能,输出应该是 Ricky Bobby 和 Mike Hawk
  • 你已经完成了,复制后你可以使用简单的>=来显示结果

标签: mysql join attributes subquery exists


【解决方案1】:

SQL DEMO

SELECT `fNameA`, `lNameA`, `fNameB`, `lNameB`, GROUP_CONCAT(`SkillA`, ' ') as Skills
FROM (
        SELECT  DISTINCT 
                CASE WHEN M1.`id` < M2.`id` THEN M1.`fName` ELSE M2.`fName` END as `fNameA`,
                CASE WHEN M1.`id` < M2.`id` THEN M1.`lName` ELSE M2.`lName` END as `lNameA`,
                CASE WHEN M1.`id` < M2.`id` THEN M2.`fName` ELSE M1.`fName` END as `fNameB`,
                CASE WHEN M1.`id` < M2.`id` THEN M2.`fName` ELSE M1.`fName` END as `lNameB`,
                M1.`Skill` as `SkillA`, M2.`Skill` as `SkillB`
        FROM Mechanic M1
        JOIN Mechanic M2
          ON M1.`id` <> M2.`id`
         AND M1.`Skill` = M2.`Skill`  
        ORDER BY M1.`id`, M2.`id`) T
GROUP BY `fNameA`, `lNameA`, `fNameB`, `lNameB`
HAVING COUNT(*) >= 3;

简单版只打印前两个字段

SELECT  M1.`fName`, M1.`lName`, M2.`fName`, M2.`lName`
FROM Mechanic M1
JOIN Mechanic M2
  ON M1.`id` <> M2.`id`
 AND M1.`Skill` = M2.`Skill` 
GROUP BY M1.`fName`, M1.`lName`, M2.`fName`, M2.`lName`
HAVING COUNT(*) >= 3;

输出

  • 部分结果
  • 第一个带有技能列表的版本
  • 简单版

【讨论】:

  • 哇,非常感谢,你能解释一下 M1 和 M2 是什么吗?我在“字段列表”中得到未知的 M1.'id'
  • 检查DEMO。我使用你的结果,你需要用你的表中的join 替换。在您的情况下应该是MechanicIDPersonID 不确定是哪一个。只是用来识别每个人的东西。
  • 好的,我用 personID 替换了 id 但我的机械表没有 fName 它只有技能作为属性。我认为我的情况有点不同,因为我在 person 表中有 fName 和 lName ,它先连接到 worker 然后再连接到 mechanic 。我试着把它们联系起来,你用机械表上的 M1 和 M2 叫什么?我想了解更多有关它的信息
  • 顺便说一句,最后一个查询是完美的,输出应该是什么
  • 是调用alias你可以更改表或字段的名称
【解决方案2】:

select fname,lname from Person where Skills >= 3 order by fname

【讨论】:

  • 不是谁拥有3个或更多技能,而是谁拥有3个或更多共同技能 我有查询显示谁拥有3个或更多技能Select fName, lName, count(Person.personID) as 'Skill Amt' from Person inner join Worker on Person.personID = Worker.personID inner join Mechanic on Worker.personID = Mechanic.personID inner join Skills on Mechanic.personID = Skills.personID group by Person.personID having count(Skills.skill) &gt;= 3 order by Person.personID
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-24
  • 2018-07-05
  • 1970-01-01
  • 1970-01-01
  • 2012-04-18
  • 1970-01-01
相关资源
最近更新 更多