@dmitriu256

Как отослать несколько запросов к БД MySql в одном get-запросе?

Новичек в Node, в качестве отработки навыков решил написать аналог новостного сайта.
С рубриками, фильтрацией по рубрикам, рейтингу, дате и тд.
Использую связку NodeJs + Express + EJS + MySQL

Как в одном get запросе объединить несколько запросов к базе.
В моем случае хочу одновременно выводить из бд отдельным списком категории, из таблицы "Категории" и списком все новости из таблицы Articles на главной странице сайта.
Список категорий успешно вывел, а вот со вторым запросом как быть не знаю.
app.get('/', function(req,res) {

    connection.query('SELECT id, category FROM categories', function (err, rows) {
        if (err) throw err;
        res.render('index', {menu: rows});
    });
});


Сделал все отдельными маршрутами,

app.get('/news', function(req,res){

    connection.query('SELECT title, id FROM articles', function (err, rows) {
        if (err) throw err;
        res.render('news', {art: rows});
    });

});


И еще один вопрос, задам тут же
Насколько верно сделана структура самой базы?
В итоге получаю вот такой запрос на выборку

Запрос на выборку одной статьи
SELECT articles.category_id,
		articles.title,
        articles.text,
        articles.image,
        articles.author_id,
        articles.raiting_id,
        articles.data,
        
       categories.category,
       authors.name,
       authors.surname,
       raitings.raiting
       
	FROM (((`articles`
    
    INNER JOIN categories
    ON
    	articles.category_id = categories.id)
           
    INNER JOIN authors 
    ON
        articles.author_id = authors.id)
          
   INNER JOIN raitings
   ON
       articles.raiting_id = raitings.id)
       
   WHERE
   		articles.id = '2';

Схему БД прилагаю.
5c26a6ee33365614636722.png

Структура главной таблицы
5c26a7102e52a289237148.png
  • Вопрос задан
  • 849 просмотров
Решения вопроса 1
@Alex_At_Net
Обращайтесь, помогу - https://t.me/codecraft_phd
Вы можете сделать следующий запрос из результата предыдущего:

app.get('/', function(req,res) {
    connection.query('SELECT ...', function (err, rows1) {
        if (err) throw err;
        connection.query('SELECT ...', function (err, rows2) {
           if (err) throw err;
           res.render('index', {menu: rows1, articles: rows2});
       });
    });
});


Есть и другие механизмы: promises, async/await, async.js.

База и запрос, как на мой взгляд, норм.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@magarif
Программист
Лучше не пытаться засунуть все в один запрос, а подумать о кешировании данных. Т.е. список категорий вряд ли будет меняться за день, можно один раз получить и сохранить себе. Со статьями можно взять интервал час. Тогда оба запроса одновременно будут выполняться очень редко, а скорость работы сайта будет выше.
Ответ написан
Комментировать
@roman94
На текущем проекте решил этот вопрос с помощью Graphql https://graphql.org/learn/ Для меня оказалась очень удобная вещь, можно одним запросом получать любые данные
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы