带4个表的嵌套MySQL查询

时间:2019-03-21 07:34:53

标签: mysql

我有4个表格,其列如下:

  links: authID1, authID2, pubID
  authors: authorName, authorID
  publications: pubID, pubTitle

我希望获得合作作者的姓名对,并且已经可以使用以下代码来获取姓名:

     SELECT 
       o.authorName AS 'authname1',
       p.authorName AS 'authname2'
      FROM links e
       JOIN authors  o
         ON (e.authID1 = o.authorID)
        JOIN authors  p
          ON (e.authID2 = p.authorID)
             JOIN  publications j 
                ON (e.pubID = j.pubID) 
                   WHERE ( j.pubTitle LIKE '%computers%') 

我当前的难题是如何获取名称对并在从发布表中获取匹配的记录时执行 LIMIT 函数。

我已经能够使用下面的两个表来做到这一点,但是我无法弄清楚3个表并两次调用一个表(authors表)。
这是我想做的一个例子:

     SELECT e.authID1, e.authID2
       FROM links AS e
          INNER JOIN
           (SELECT pubID
             FROM publications 
               WHERE ( j.pubTitle LIKE '%computers%')
                  LIMIT 4) as j
          ON e.pubID = j.pubID

2 个答案:

答案 0 :(得分:1)

您可以创建一个函数以返回作者姓名。经验:

create function get_author_name (id int ) returns varchar(255)
BEGIN
     DECLARE author_name varchar(255);
     SELECT authorName  INTO author_name
     FROM authors        
     WHERE authorID = id;
     RETURN author_name;
END;

然后使用它

 SELECT e.authID1, e.authID2, get_author_name(e.authID1) as author1, get_author_name(e.authID2) as author2
   FROM links AS e
      INNER JOIN
       (SELECT pubID
         FROM publications 
           WHERE ( j.pubTitle LIKE '%computers%')
              LIMIT 4) as j
      ON e.pubID = j.pubID

答案 1 :(得分:1)

如果问题仅在于SQL语法,则应为解决方案:

SELECT DISTINCT
   o.authorName AS 'authname1',
   p.authorName AS 'authname2'
FROM links e
INNER JOIN authors  o
ON e.authID1 = o.authorID
INNER JOIN authors  p
ON e.authID2 = p.authorID
INNER JOIN  (SELECT DISTINCT pubID
             FROM publications 
             WHERE ( j.pubTitle LIKE '%computers%')
             LIMIT 4) as j  
ON e.pubID = j.pubID 

我添加了2个DISTINCT,以确保您没有检索重复的记录。