Mysql

如何檢索在MySql的行中的另一列中找到主鍵值的所有行

  • May 20, 2017

以下是快照中的 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在這裡

引用自:https://dba.stackexchange.com/questions/174100