#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 довольно бессмысленно