我正在使用以下脚本:
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 BY
和LIMIT
子句。特别是如果id_autor
列在autor
表中是UNIQUE。此处包括它们是为了演示更一般的情况,不能超过一个“匹配”行; SELECT列表中的子查询只允许返回一个表达式和单个行。LIMIT 1子句将其限制为单个行,而ORDER BY
可以确定是哪一个可能的值将被返回。)关于mysql - MySQL加入3个表的自反关系,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25675317/