2014-09-04 38 views
0

我使用下面的腳本:MySQL的加入3個表自反關係

SELECT autor.id_autor as 'ID de Autor', 
autor.nom_autor as 'Nombre Autor', 
CASE autor.id_autor 
WHEN ISNULL(autor.pseudo_id = autor.id_autor) THEN nom_autor 
ELSE null 
END 
'Autor Real', -- nombre de la columna de la tabla 

articulo.id_art as 'ID de Articulo', 
articulo.nom_art as 'Nombre de Articulo' 
FROM autor 
LEFT JOIN art_aut ON (art_aut.id_autor = autor.id_autor) 
LEFT JOIN articulo ON(articulo.id_art = art_aut.id_art); 

顯示AUN作者的真實姓名。

我有很多表,你可以看到,但我想這些表中以「飼料」下面的表格顯示,就像下面:

ID de Autor Nombre Autor Autor Real ID de Articulo Nombre Articulo 
    A3   Quijote  Luis   1    El origen 

我有一個表叫作者日期是以下:

id_autor nom_autor RFC  pseudo_id 
A1   J Salinas ADAD12  
A3   Quijote     A7 
A7   Luis  LIDSDS  

正如你可以看到自己的表引用,但我不知道我有什麼樣的指令,以寫作者,就像「堂吉訶德」顯示自己的真實姓名和那些不有另一個名字,就像Juanito Salinas一樣,因爲y在pseudo_id列中沒有記錄

在此先感謝!

回答

0

我不完全理解您的查詢。

如果我的理解正確,請將您的autor表定義爲名爲pseudo_id的列,該列是引用同一個表中的id_autor列的外鍵。

要檢索相關行,您可以執行JOIN操作,可能需要「外部」連接,以便返回autor傳說中的所有行以及「匹配」行(如果有)。

例如:

SELECT a.id_autor 
    , a.nom_autor 
    , r.nom_autor AS `Autor Real` 
    , ... 

    FROM autor a 
    LEFT 
    JOIN autor r ON r.id_autor = a.pseudo_id 

Autor Real值將具有從當找到匹配的行所引用的行(r)的nom_autor列中的值,並且將否則會是NULL。

這裏的「訣竅」是您需要對查詢中的autor表進行第二次引用,以檢索第二(相關)行。就好像對autor表的第二個引用是與另一個表一樣,就像查詢引用的任何附加表一樣。


作爲另一個(通常性能較低的)備選方案,可以使用相關子查詢來代替JOIN操作。

例如:

SELECT a.id_autor 
    , a.nom_autor 
    , (SELECT r.nom_autor 
      FROM autor r 
      WHERE r.id_autor = a.pseudo_id 
      ORDER BY r.nom_autor 
      LIMIT 1 
     ) AS `Autor Real` 
    , ... 
    FROM autor a 

這是在SELECT列表中的 「相關」 子查詢。該查詢引用外部查詢中的列,並且對外部查詢返回的每個行執行該子查詢。)如果子查詢未返回值,則外部查詢將返回NULL值。

(注意:不能在您的查詢需要的ORDER BYLIMIT條款特別是如果id_autor列是autor表UNIQUE他們要在這裏包括證明更一般的情況,其中可能有不止一個「匹配」行; SELECT列表中的子查詢被允許僅返回單個表達式和單個行。LIMIT 1子句將其限制爲單行,並且ORDER BY確定將返回哪些可能的值。)

+0

感謝您的回答。它解決了我的問題! – 2014-09-07 18:45:01