Синтаксис запроса SQL для извлечения данных из 2 таблиц

#mysql

#mysql

Вопрос:

У меня есть 2 таблицы в Mysql: authors и articles .

У меня есть авторы с несколькими статьями для каждой из них.

Мне нужен SQL-запрос с результатом этого запроса: получить 3 автора, упорядоченных по возрасту, со всеми статьями, которые принадлежат каждому из них.

В моем примере это будет

 ID  FIRSTNAME   LASTNAME    AGE AUTHORID    TITLE       PRICE
6   Salido      Gomes       90  6           All 3       1
6   Salido      Gomes       90  6           All 3       33
6   Salido      Gomes       90  6           All 3       3
5   Vitora      Mantora     45  5           Total 3     99
5   Vitora      Mantora     45  5           Total 3     33
5   Vitora      Mantora     45  5           Total 3     12
3   Joe         Smith       43  3           Python      5
3   Joe         Smith       43  3           Python 2    22
3   Joe         Smith       43  3           Python 3    44
3   Joe         Smith       43  3           Python 4    12
3   Joe         Smith       43  3           Python 5    67
  

http://sqlfiddle.com /#!2/718c4/1

Я использую

 select * from authors join articles on authors.id = articles.authorId
join (select authors.id from authors order by age DESC limit 3) as t
on t.id = authors.id
  

с неправильным результатом

 ID  FIRSTNAME   LASTNAME    AGE AUTHORID    TITLE   PRICE
6   Salido      Gomes       90  6           All 3   1
6   Salido      Gomes       90  6           All 3   33
6   Salido      Gomes       90  6           All 3   3
  

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

1. Проблема здесь в том, что из ваших 3 старейших авторов 2 не написали никаких статей в тестовых данных, которые вы предоставили (ID 7 и 8) в sql fiddle. Следовательно, возвращаются только сведения об одном авторе.

Ответ №1:

Если вы хотите включить авторов, написавших какие-либо статьи, только в топ-3 старейших авторов, попробуйте выполнить объединение между авторами и статьями в подзапросе, чтобы получить 3 старейших автора, и DISTINCT для устранения дубликатов:-

 SELECT * 
FROM 
(
    SELECT DISTINCT authors.id, authors.firstname, authors.lastname, authors.age
    FROM authors 
    JOIN articles 
    ON authors.id = articles.authorId
    ORDER BY authors.age 
    DESC 
    LIMIT 3
) author_sub
JOIN articles 
ON author_sub.id = articles.authorId