MySQL选择相关的行

时间:2018-11-02 11:28:22

标签: mysql

我有桌子:

id | parent | regno | person
1  | 0      | 12    | 5
2  | 1      | 12    | 15
3  | 0      | 13    | 5
4  | 0      | 14    | 6

我有MySQL查询...

SELECT * 
  FROM table 
 WHERE person='5';

...返回第1行和第3行。

在此表中,第1行和第2行相关(regno相同)。

如何构建此查询以包含相关行?

基本上,在搜索第5个人时,我需要MySQL查询以返回以下内容:

id | parent | regno | person
1  | 0      | 12    | 5
2  | 1      | 12    | 15
3  | 0      | 13    | 5

父列具有与之相关的列的ID,但它可以是正整数和负整数。所有相关行始终具有相同的regno。

谢谢。

2 个答案:

答案 0 :(得分:0)

  • 您可以在Derived Table中获得id的所有person = '5'值。
  • 现在,返回到主表,匹配parent的绝对值(以获取子行)或id的绝对值(以获取父ID行本身)。 / li>

基于discussion in comments,请尝试:

SELECT t.* 
FROM your_table AS t 
JOIN 
(
  SELECT id AS parent_id  
  FROM your_table 
  WHERE person = '5'
) AS dt 
  ON dt.parent_id = ABS(t.parent) OR 
     dt.parent_id = t.id 

尽管很难理解,为什么还要在parent中放入负值!

答案 1 :(得分:0)

您希望所有人的regno与第5个人的所有人的regno相同:

--this main query finds all people with the regno from the subquery
SELECT * 
FROM table
WHERE regno IN 
( --this subquery finds the list of regno
  SELECT regno
  FROM table 
  WHERE person = '5'
)

还有其他写方法;我不是IN的粉丝,个人会这样写:

SELECT t.* 
FROM table t
INNER JOIN
(
  SELECT DISTINCT regno
  FROM table 
  WHERE person = '5'
) u
WHERE t.regno = u.regno

但是很难理解,而且这些查询很有可能最终会在内部完全相同地执行。以这种形式,D​​ISTINCT才能使子查询的regno唯一。如果不是这样,联接的行将最终重复。为什么我更喜欢IN?在某些数据库系统中,IN的实现可能非常幼稚且性能低下。 “我永远不会坚持使用IN来创建列表,否则会用手写”。这种连接模式也更加灵活,可以使用多个值。并非每个数据库都支持Oracle式where x,y in ((1,3),(3,4))值倍数

顺便说一句(部分是对这个答案的第一条评论),让数据库准备在同一行上具有父数据和子数据的行集会更典型,更有用/更常用

它看起来像这样:

SELECT * 
FROM 
table c
LEFT OUTER JOIN
table p
ON c.regno = p.regno AND p.parent = 1
WHERE c.person = '5' AND c.parent=0

这是假设您的“父母”列为0 1表示是假。.您似乎已经注释了“父母”是亲戚的ID(不确定是“亲子”还是“亲子”)

对于具有id和parentid列的表,并且当该行是该其他id的子级时,parentid设置为一个值;

id, parentid, name
1, null, Daddy
2, 1, Little Jonny
3, 1, Little Sarah

看起来像:

选择*     从     表c     内部联接     表p     开启c.parentid = p.id     p.parentid ID NULL

行只能有一个父母。父代ID中的NULL将行定义为父代,否则为子代。如果需要,可以颠倒这个逻辑,将其命名为isparentof列,并将所有子行都包含在isparentof中,并且将任何具有孩子的父级的人的子ID排除在isparentof中。然后,这将您的孩子数限制为多父母(一个孩子家庭)中的一个。.将他们拉出的查询大致相同