簡體   English   中英

MySQL選擇相關的行

[英]mysql select rows including related

我有桌子:

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。

謝謝。

  • 您可以在派生表中獲取person = '5'所有id值。
  • 現在,返回到主表,匹配parent的絕對值(以獲取子行)或id (以獲取父級ID本身)。

根據評論中的討論 ,嘗試:

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放置負值!

您希望所有人的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,表示為true。。您似乎已經注釋了parent是親戚的ID(不確定是parent-of還是parent-is)

對於一個表,其中有一個id和parentid列,並且當該行是另一個id的子級時,parentid設置為一個值;

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

看起來像:

SELECT * FROM表c INNER JOIN表p ON c.parentid = p.id WHERE p.parentid ID NULL

行只能有一個父級。 父代ID中的NULL將行定義為父代,否則為子代。 如果需要,可以顛倒這個邏輯,將其命名為isparentof列,並將所有子行都包含在isparentof中,並且將任何具有孩子的父級的人的子ID排除在isparentof中。 然后,這將您限制為每位多親(一個孩子家庭)有一個孩子。.將他們拉出的查詢大致相同

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM