[英]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。
謝謝。
您希望所有人的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,表示為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.