Laravel добавить вычислить сумму, где значение находится в другой таблице - PullRequest
0 голосов
/ 16 февраля 2020

В основном у меня есть две таблицы. answers и choices. В моей таблице choices я получил столбец choices.value, который имеет значения 0-4. Мой текущий запрос, подобный этому

 $answers = \DB::table('answers')
                    ->join('choices','answers.choice_id','=','choices.choice_id')
                    ->select('answers.user_id','choices.choice_id','choices.choice','choices.value')
                    ->where('answers.user_id',\Auth::user()->id)
                    //->groupBy('answers.user_id')
                    ->get();

Мой текущий ответ похож на это

    "user_id": 2,
        "choice_id": 2,
        "choice": "I feel discourated about the future",
        "value": 1
    },
    {
        "user_id": 2,
        "choice_id": 2,
        "choice": "I don't enjoy things the way I used to",
        "value": 1
    },
    {
        "user_id": 2,
        "choice_id": 2,
        "choice": "I feel guilty a good part of time",
        "value": 1

как мне добавить значения, чтобы мой результат был таким

"user_id":2,
"total_score":3

Я пытался сделать DB::raw(SUM(choices.values)as score), но я получаю большую сумму. Я предполагаю, что это добавление всех значений выбора из таблицы выбора, а не в ответах.

Мои ответы db, в которых я выбираю только ответы пользователя = 2. Я ограничиваюсь 5

+---------+-------------+-----------+
| user_id | question_id | choice_id |
+---------+-------------+-----------+
|       2 |           1 |         2 |
|       2 |           2 |         2 |
|       2 |           3 |         2 |
|       2 |           4 |         2 |
|       2 |           5 |         2 |
+---------+-------------+-----------+

Моя таблица выбора, я выбираю только вопросы 1 и 2 и их варианты.

+-----------+-------------+--------------------------------------------------------------+-------+
| choice_id | question_id | choice                                                       | value |
+-----------+-------------+--------------------------------------------------------------+-------+
|         1 |           1 | I do not feel sad                                            |     0 |
|         2 |           1 | I feel sad                                                   |     1 |
|         3 |           1 | I am sad all the time and I can't snap out of it             |     2 |
|         4 |           1 | I am so sad and unhappy that I can't stand it                |     3 |
|         1 |           2 | I am not particularly discouraged about the future           |     0 |
|         2 |           2 | I feel discourated about the future                          |     1 |
|         3 |           2 | I feel I have nothing to look forward to                     |     2 |
|         4 |           2 | I feel the future is hopeless and that things cannot improve |     3 |
+-----------+-------------+--------------------------------------------------------------+-------+

Также я хочу создать новую таблицу с именем scores, и столбцы будут результатом того, что я хочу. Я хочу добавить choices.values в ответе в каждый answers.user_id, чтобы при просмотре таблицы результатов отображалась общая оценка по каждому пользователю или когда пользователь заканчивал отвечать на все 21 вопросы, потому что я получил только 21 элементы, которые будут автоматически добавлены в таблицу scores. Могу ли я это сделать? Можно ли добавить value в таблицу answers, основанную на choice_id? Это то, что я думаю, но я думаю, что это избыточно, поскольку choice_id уже есть. Заранее спасибо.

PS: пробовал писать эти запросы, но всегда получал 441, что составляет value всех вариантов в choices таблице

SELECT  answers.user_id,choices.choice_id,choices.value,COALESCE(sum(choices.value),0) as score  FROM 
`answers`  JOIN `choices` ON  choices.choice_id = answers.choice_id where 
answers.user_id = 2

SELECT answers.user_id,choices.choice_id,choices.value,SUM(choices.value),0 as score FROM `answers`
join choices on choices.choice_id = answers.choice_id
where answers.user_id = 2

SELECT answers.user_id,choices.choice_id, sum(choices.value) from answers 
JOIN `choices` ON  choices.choice_id = answers.choice_id
group by answers.user_id 

Ответы [ 2 ]

1 голос
/ 16 февраля 2020

В настоящее время вы соответствуете только выбору, но вам нужно соответствовать как выбору, так и вопросу.

Я нашел это после того, как увидел, что у каждого варианта есть выбор. У вопросника есть варианты 1, 2, 3 и 4 в непринужденной беседе. Я не знал, пока не увидел скриншот таблицы выбора.

$answers = \DB::table('answers')
                    ->join('choices', function ($q) {
                    $q->on('answers.choice_id','=','choices.choice_id')
                    ->on('answers.question_id', '=', 'choices.question_id');
                    })
                    ->select('answers.user_id',\DB::raw('sum(choices.value) as total'))
                    ->groupBy('answers.user_id')
                    ->get();
1 голос
/ 16 февраля 2020

используйте группу, возможно, это поможет

 $answers = \DB::table('answers')
                    ->join('choices','answers.choice_id','=','choices.choice_id')
                    ->select('answers.user_id',DB::raw('count(*) as total'))
                    ->where('answers.user_id',\Auth::user()->id)
                    ->groupBy('answers.user_id')
                    ->get();
...