SUM / IF с ВНУТРЕННИМ СОЕДИНЕНИЕМ в MySQL — как превратить его в knex-запрос?

#javascript #mysql #node.js #knex.js

#javascript #mysql #node.js #knex.js

Вопрос:

У меня есть этот оператор MySQL ниже, который работает так, как задумано. Чувствую себя прекрасно по этому поводу … но…

Я пытаюсь понять, как получить это в knex.js конструктор запросов. В knex.js документы, которые я видел. Я смог суммировать только один столбец с knex.js . The knex.js похоже, это не относится к этому вопросу. Идея в том, что есть положительные и отрицательные отзывы о том, что я создаю. Я хочу знать голоса для каждой категории, а затем общую сумму (up down = total). Я пытаюсь избежать разбиения этого на разные запросы. Я пока не нашел ни одного хорошего примера.

Кто-нибудь может помочь? Спасибо.

     use iconwebsite;
    SELECT 
        i.icon_description,
        SUM(IF(v.vote_score > 0, v.vote_score, 0)) AS up,
        SUM(IF(v.vote_score < 0, v.vote_score, 0)) AS down,
        SUM(IF(v.vote_score, v.vote_score, 0)) AS total
        
    FROM
        icon i
            INNER JOIN
        vote v ON i.icon_id = v.icon_id
    GROUP BY i.icon_description;

  

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

1. Я не понимаю смысла третьего IF (а в MySQL первые два являются избыточными)

2. Предположительно, у вас уже есть подключение к вашей базе данных в другом месте вашего кода, поэтому я бы предположил, что «использовать iconwebsite» тоже излишне, но если вам нужно указать db в запросе, просто добавьте в таблицы префикс «iconwebsite».

Ответ №1:

Вы можете использовать необработанный SQL с knex подобным образом с вашим запросом:

 knex.select(knex.raw(`
    use iconwebsite;
    SELECT 
        i.icon_description,
        SUM(IF(v.vote_score > 0, v.vote_score, 0)) AS up,
        SUM(IF(v.vote_score < 0, v.vote_score, 0)) AS down,
        SUM(IF(v.vote_score, v.vote_score, 0)) AS total
        
    FROM
        icon i
            INNER JOIN
        vote v ON i.icon_id = v.icon_id
    GROUP BY i.icon_description;
`))
  

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

1. Спасибо за быстрый ответ. Я смотрю на то, что вы присылаете мне на knex.js … все еще не понимаю. Как бы это выглядело с суммой, если учесть контекст, который я предоставил?

2. Если можете, придерживайтесь необработанного SQL, это так освобождает 🙂

3. Я также озадачен тем, как это помогает

4. Я обновил ответ, чтобы показать, как он используется в случае topicstarter. @paul-w, это то, что ты искал?

5. Да, я понял. Я нашел это после публикации вопроса и собрал что-то, что сработало. github.com/knex/knex/issues/1606