当前位置: 首页 > 面试题库 >

如何在具有可传递性的MySQL联接(同一表)中选择不同的对?

贺飞星
2023-03-14
问题内容

我面对的是一个设计不当的数据库,该数据库具有非规范化的表X。该表X应该与另一个表Y具有N:M关系。

问题在于,这种关系当前为1:N,而到目前为止,在存在各种要关联的注册表的情况下,使用杰瑞操纵的解决方案是重复这些条目。

简化一下,我有这个:

| ID | TEXT | LOCATION_ID |
| 1  | foo  |      1      |
| 2  | foo  |      2      |
| 3  | bar  |      1      |
| 4  | bar  |      4      |
| 5  | bar  |      3      |

我必须对这张表进行归一化处理。因此,我的第一个想法是尝试获取成对的相似注册表。像这样的东西:

| a.ID | b.ID | 
|   1  |  2   |
|   3  |  4   |
|   3  |  5   |

做一点实验:

SELECT a.id, b.id 
FROM mytable AS a 
INNER JOIN mytable AS b 
   ON a.text = b.text AND a.id != b.id 
GROUP BY a.id, b.id

这导致这样的问题:

| a.ID | b.ID | 
|   1  |  2   |
|   2  |  1   |
|   3  |  4   |
|   3  |  5   |
|   4  |  3   |
|   4  |  5   |
|   5  |  3   |
|   5  |  4   |

两对重复。

经过一番挖掘,我意识到这种方法更有效:

SELECT a.id, b.id 
FROM mytable AS a 
INNER JOIN mytable AS b 
        ON a.text = b.text AND a.id < b.id 
GROUP BY a.id, b.id

所以,我得到了这个:

| a.ID | b.ID | 
|   1  |  2   |
|   3  |  4   |
|   3  |  5   |
|   4  |  5   |

但是我仍然需要摆脱最后一个寄存器。


问题答案:

仅在一侧分组,然后在另一侧分组MIN()

SELECT   MIN(a.ID) a, b.ID b
FROM     mytable a JOIN mytable b ON b.text = a.text AND b.ID > a.ID
GROUP BY b.ID

在sqlfiddle上看到它。



 类似资料:
  • 问题内容: 我有两个要连接的表。 TABLE_A: TABLE_B: RESULT_TABLE: 我试图使用这样的东西: 但是,结果仅包括该列存在于TABLE_A中的行。 有没有办法连接TABLE_A和TABLE_B以产生RESULT_TABLE中显示的结果? 问题答案: 如果要获得所有结果,则需要一个 外部 联接,而不是一个 内部 联接。(内部仅返回匹配的行;外部返回所有行,其中匹配的行“缝合在

  • 问题内容: 该查询工作正常。但是问题是,产品表和类别表都具有名为“ name”和“ id”的字段。因此,当我获取此查询的结果时,它只给我一个名称和一个ID,但同时又需要ID和名称。 我如何做到这一点而不必重命名字段?是否可以使用自定义名称(例如product_name和category_name)返回? 问题答案: 您可以将别名添加到字段:

  • 问题内容: 在SQL中,将行复制到另一个(备份)表中。如果备份表具有不同的结构(或不同的列名称),这可能吗?如果没有,实现此目标的最佳方法是什么? 这是我想做的:具有columns 。我想将一些行从该表复制到另一个具有column的表。内容进入,对等 问题答案: 该 列名 不事可言,只要该 数据类型 相匹配。 如果列的数据类型不匹配,请尝试相应地强制转换值。 只需尝试 使用小的虚拟表。确保明确列出

  • 问题内容: 我的表是: 我想列出一组具有相同疾病的患者。pid和did分别是患者和疾病表中的主键,并且是has_disease表中的外键。 样本数据: 耐心 疾病 has_disease 以上数据的答案是因为它们具有完全相同的疾病1和3,即疟疾和病毒热。我想知道如何在mysql中实现这一点。 。 问题答案: 该查询返回给我们患者及其疾病。 通过完整的剂量列表比较2组患者,并将pid保留为相同的剂量

  • 问题内容: 我有两个mysql表-销售表: 和一个项目表: sales表包含每个 ItemID的 多个记录-每个 SaleWe​​ek一个 。我想通过加入两个表来选择出售的所有商品,如下所示: 但是,这将基于每个 SaleWe​​ek* 的多个条目返回多个 ItemId 值。我可以做一个单独的选择,只返回一个 ItemID 吗?-我不想查询最新的 SaleWe​​ek, 因为有些项目可能没有最新的

  • 问题内容: 我正在尝试选择mysql表中的重复行,它对我来说很好,但问题是它不是让我选择该查询中的所有字段,而是让我选择用作不同的字段名,让我写查询更好的了解 第一个工作正常 现在,当我尝试选择所有字段时,我最终会出现错误 我正在尝试选择最新的重复项,比如说ticket_id 127是行ID 7、8、9的3倍,因此我想选择一次,最新条目在这种情况下为9,这适用于所有其余项ticket_id的 任何