我有桌子:
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。
谢谢。
答案 0 :(得分:0)
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
但是很难理解,而且这些查询很有可能最终会在内部完全相同地执行。以这种形式,DISTINCT才能使子查询的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中。然后,这将您的孩子数限制为多父母(一个孩子家庭)中的一个。.将他们拉出的查询大致相同