Проблема с добавлением SQL

0

Пожалуйста,

Я пытаюсь получить некоторую общую ценность полученных пользователями баллов в нескольких отличительных подсчетах, но все из одной таблицы.

SQL:

SELECT o.author_id, SUM(o.vote_value) AS vote_value, n.best AS best_sum, 
                (SUM(o.vote_value) + (10 * n.best)) AS total
                FROM comments o
                LEFT JOIN (
                  SELECT COUNT(best) AS best, author_id
                  FROM comments
                  WHERE best = 1
                  GROUP BY author_id
                  ) n ON o.author_id = n.author_id
                GROUP BY o.author_id
                ORDER BY total DESC
                LIMIT 0, 4

Проблема в том, что нет BEST (по умолчанию 0, а лучше 1). Я ничего не получаю для "total" и "best_sum". Мне нужно 0, если у пользователя нет "наилучшего", так что вычисление может быть выполнено правильно

Извините, мой плохой английский, я думаю, вы поймете Благодаря

Теги:

3 ответа

0
Лучший ответ

Я думаю, ваша проблема в том, что вы отфильтровываете строки, где лучше всего не 1, поэтому они не включены в группу. Попробуйте следующее:

SELECT o.author_id, SUM(o.vote_value) AS vote_value, n.best AS best_sum, 
            (SUM(o.vote_value) + (10 * n.best)) AS total
            FROM comments o
            JOIN (
              SELECT SUM(best) AS best, author_id
              FROM comments
              GROUP BY author_id
              ) n ON o.author_id = n.author_id
            GROUP BY o.author_id
            ORDER BY total DESC
            LIMIT 0, 4

Кроме того, может быть, я чего-то не хватает, но не будет ли это работать, сохраняя подзапрос?

SELECT o.author_id, SUM(o.vote_value) AS vote_value, SUM(o.best) AS best_sum, 
            (SUM(o.vote_value) + (10 * SUM(o.best))) AS total
            FROM comments o
            GROUP BY o.author_id
            ORDER BY total DESC
            LIMIT 0, 4
  • 0
    Тьфу ... второй работает и не нуждается в подзапросе :) Спасибо, ты сохранил мой день :)))
0

Я предполагаю, что вы хотите иметь значение 0, если best = NULL попробуйте COALESCE

count(COALESCE(best,0) AS best)
  • 0
    Я думаю, что это не работает, потому что best всегда равен 1 (предложение WHERE требует этого). Проблема возникает из-за того, что LEFT JOIN создает NULL, поэтому, если вы хотите использовать COALESCE, вы должны будете сделать это, как предложил Сергиом.
0

Вы должны использовать COALESCE (n.best, 0)

COALESCE возвращает второй параметр, когда первый имеет значение NULL

SELECT o.author_id, SUM(o.vote_value) AS vote_value, 
            COALESCE(n.best, 0) AS best_sum, 
            (SUM(o.vote_value) + (10 * COALESCE(n.best, 0))) AS total
            FROM comments o
            LEFT JOIN (
              SELECT COUNT(best) AS best, author_id
              FROM comments
              WHERE best = 1
              GROUP BY author_id
              ) n ON o.author_id = n.author_id
            GROUP BY o.author_id
            ORDER BY total DESC
            LIMIT 0, 4
  • 1
    Я думаю, что вы исправили только best_sum. Всего нужно такое же лечение.
  • 0
    @ Отметьте, что вы правы, я исправил код соответственно :)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню