【问题标题】:Querying for multiple rows in a table (and its pair in the same table) where one half of the pair is connected to one id in another table查询表中的多行(及其在同一个表中的对),其中一半对连接到另一个表中的一个 id
【发布时间】:2021-02-05 05:30:23
【问题描述】:

这是一个我试图在 SQL 中解决的随机问题。

假设您有一个表格,其中行成对出现。所以你将拥有:

same_table
ID Name Family_Id Other_id
1   B.       1.       2 --> This ID is id 2 in the same table.
2.  C.       nil      nil
3   D.       1        4 --> this ID is also the next row in the table.
4   E.       nil      nil

抱歉,这非常令人费解且难以解释。本质上,我需要将行连接到 family_id 1 和该对的另一部分。

所以我知道SELECT * FROM same_table WHERE family_id=1 --> 会得到一半。

如何编写一个查询,专门查找连接到特定 family_id 的行和该行对。

对不起...解释得不好,但我不知道该怎么问。

【问题讨论】:

  • 在上述情况下,是否还需要返回四行,返回两行是否更合适?比如B, C作为第一行,D, E作为第二行?
  • 每一行都与一个对象相关,如果有意义,我需要所有 4 个对象?
  • 您仍然可以在一行中获取两个对象的完整信息...ID, Name, FamilyID, OtherID, OtherName 在一行中,ID, Name 描述父行,OtherID, OtherName 描述子行 (如果没有孩子,则包含 NULL)。然后,它只是一个LEFT JOIN
  • 抱歉还是很新。所以本质上,我想找到两者并将它们存储在一个变量中,该变量将它们全部作为变量中的单独对象。因此,当我调用该变量时,我拥有所有这些行?如果这有意义的话。

标签: mysql sql


【解决方案1】:

好吧,如果层次结构只有一层深(如您的示例数据和解释),您可以使用exists

select t.*
from same_table t
where t.family_id = :input or
      exists (select 1
              from same_table t2
              where t2.other_id = t.id and t2.famil_id = :input
             );

【讨论】:

  • 是的,从字面上查找与单个 family_id 相关的所有行以及同一表中该行的伙伴。感谢您的回复,我会尝试一下...如果您明白我在问什么,有没有更好的方法让我解释/问一下哈哈。
  • 您好,您能解释一下存在后的select 1吗?那 1 是否意味着与上一行中的 t.family_id= 1 相同??
  • @Tigiras 。 . . SELECT 1 中的 1 语法方便,因为 exists 只检查是否返回 rows(而不是行中的内容)。我更新了答案以澄清这一点。
猜你喜欢
  • 2014-09-25
  • 2021-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-02
  • 1970-01-01
  • 2016-08-31
  • 1970-01-01
相关资源
最近更新 更多