Horik_off
@Horik_off
Developer

Как грамотно составить запрос к серверу баз данных?

Есть следующая структура бд

48050186343948a791b06d2e7cb84f61.png

Как грамотно составить запрос к бд, чтобы в результирующем множестве были:

1. Все публикации одного автора, принадлежащие к одному журналу (в бд всего три журнала и автор, чисто гипотетически может печататься в любом).

2. Далее полученную выборку надо рассортировать по годам, журналам и выпускам. Например, у автора M было N публикации в журнале X в году Y.

Для большего понимания, хочу сделать для наглядности график публицистической активности каждого автора, пока данные тестовые, но в идеале хочется получить набор данных с описанием в каком году и в каком выпуске сколько публикации было сделано тем или иным автором с сортировкой по разным журналам. один цвет на графике = один журнал.

ad31d6ca820d4f2db872fde60fc7c892.png

чтобы уж ясно было кто и как и когда. Но давно не писал запросов сложных, ничего не помню. Помогите, пожалуйста. Спасибо.
  • Вопрос задан
  • 129 просмотров
Решения вопроса 1
@Wol_fi
php, js, mysql, highload
1. Все публикации одного автора, принадлежащие к одному журналу (в бд всего три журнала и автор, чисто гипотетически может печататься в любом).

SELECT a.* 
FROM ArticlesAuthors aa 
INNER JOIN  Articles a ON aa.article_id = a.id 
INNER JOIN  Issue i ON a.fk_issue = i.id 
INNER JOIN Journals j ON i.fk_journal_id = j.id 
WHERE aa.author_id = %нужный айди автора% 
AND j.id = %нужный айди журнала%

2. Далее полученную выборку надо рассортировать по годам, журналам и выпускам. Например, у автора M было N публикации в журнале X в году Y.

SELECT aa.author_id, j.id, yoi.year_issue, count(a.*) 
FROM ArticlesAuthors aa 
INNER JOIN  Articles a ON aa.article_id = a.id 
INNER JOIN  Issue i ON a.fk_issue = i.id 
INNER JOIN Journals j ON i.fk_journal_id = j.id 
INNER JOIN YearOfIssue yoi ON i.fk_year_of_issue = yoi.id 
GROUP BY aa.author_id, j.id, yoi.year_issue

Насчёт второго запроса - не уверен, надо тестить, но вроде так.

P.S. Таблица YearOfIssue лишняя, насклько я понимаю, у каждого выпуска только 1 год, добавьте столбец year в Issue, а таблицу YearOfIssue снесите. Лишняя фрагментация данных и минус 1 джоин в запросах.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Stalker_RED
@Stalker_RED
SELECT * from ArtichesAuthors
LEFT JOIN articles ON articles.id=ArtichesAuthors.author_id
LEFT JOIN Journals ON ...
LEFT JOIN Issue ON ...
LEFT JOIN YearOfIssue ON ...
WHERE author_id=1
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы