Mysql
如何檢索在MySql的行中的另一列中找到主鍵值的所有行
列 sno 可以在列 p_sno 的其他行中找到。IE
sno = 5 linked through p_sno = 5 with sno = 6 (two rows) sno = 8 linked through p_sno = 8 with sno = 9 while sno = 9 linked through p_sno = 9 with sno = 10 (three rows)
相似地
sno = 13 linked to sno = 14 by p_sno = 13 (two rows)
現在,我需要從這張表中返回
sno = 5 and sno = 6 if someone search by temp_no = 2017-05 or temp_no = 2017-06
與其他行相同,例如,如果有人使用 temp_no = 2017-08 進行搜尋,它應該返回三行,即 sno = 8、sno = 9 和 sno = 10 等等。
幫助提前表示讚賞。
你可以(很容易)做一個層次的關係,然後
UNION
是結果。這就是獲取與temp_no = '2017-06'
(以及使用 SQL 標準的查詢)相關的行所需要的:SELECT * FROM ( -- Direct search SELECT * FROM t AS t0 WHERE t0.temp_no = '2017-06' UNION -- One level related SELECT t1.* FROM t AS t0 JOIN t AS t1 ON t1.sno = t0.p_sno WHERE t0.temp_no = '2017-06' ) AS u ORDER BY sno ;
給予:
斯諾| temp_no | 第一方| 第二方| p_sno --: | :------ | :---------- | :----------- | ----: 5 | 2017-05 | 阿赫塔爾·阿里 | 阿米爾汗 | *空值* 6 | 2017-06 | 阿赫塔爾·阿里 | 阿米爾汗 | 5
dbfiddle在這裡
注意:我已將您的
p_sno = 0
值替換為空值,在我看來這更能代表此列的含義。您似乎想使用 p_sno 和 sno 之間的父子關係查找某一行的所有後代。這是一個無限深的多層次層次結構。如果您使用支持遞歸 CTE 的數據庫(例如 MariaDB 而不是 MySQL),則可以使用遞歸 CTE 中解釋的:檢查 CTE 以獲取父級的所有子級(後代)。
如果您的問題僅限於 MySQL,您可以使用 如何創建 MySQL 分層遞歸查詢中描述的技術,這將使您為您的
temp_no = '2017-08'
案例生成以下查詢:SELECT t_sorted.* FROM (SELECT * FROM t ORDER BY p_sno, sno ) AS t_sorted, (SELECT @pv := (SELECT sno FROM t WHERE temp_no = '2017-08' ) ) AS init WHERE -- for first row t_sorted.sno = @pv -- recursive query OR (find_in_set(p_sno, @pv) > 0 AND @pv := concat(@pv, ',', sno)) ;
斯諾| temp_no | 第一方| 第二方| p_sno --: | :------ | :---------- | :----------- | ----: 8 | 2017-08 | 阿米爾汗 | 薩利姆 | *空值* 9 | 2017-09 | 阿米爾汗 | 薩利姆 | 8 10 | 2017-10 | 阿米爾汗 | 薩利姆 | 9
dbfiddle在這裡