我正在使用以下脚本:

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


我有一个称为autor的表,如下所示:

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


如您所见,表引用了它自己,但我不知道我必须写什么样的指令才能使像“ Quijote”这样的作者显示真实姓名,而没有像Juanito Salinas那样没有其他姓名的作者,保持不变,因为他们在pseudo_id列中没有记录

提前致谢!

最佳答案

我不完全了解您的查询。

如果我正确理解,您的autor表作为名为pseudo_id的列,这是一个引用同一表中id_autor列的外键。

要检索相关的行,您可以执行JOIN操作,可能需要“外部”联接,以便返回autor故事中的所有行以及“ matching”行(如果有的话)。

例如:

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值将具有引用行(nom_autor)的r列中的值,否则它将为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可以确定是哪一个可能的值将被返回。)

关于mysql - MySQL加入3个表的自反关系,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25675317/

10-13 02:00