Вложенные запросы MySQL с 4 таблицами

#mysql

#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 таблицами и дважды вызвать одну таблицу (таблицу авторов).
это пример того, что я хочу сделать :

      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
  

Комментарии:

1. Вы пытались заменить публикации таблицы подзапросом, как вы сделали во втором запросе, также в первом запросе? В чем проблема при этом? У вас проблемы с правильным синтаксисом?

2. @kiks да, у меня проблема с синтаксисом, я не писал попытки здесь, поскольку это заняло бы много места в тексте вопроса

Ответ №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 , чтобы быть уверенным, что вы не извлекаете дублирующиеся записи.

Ответ №2:

Вы можете создать функцию для возврата имени автора. Exp:

 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. Обратите внимание, что ОГРАНИЧЕНИЕ без ORDER BY довольно бессмысленно