Mysql IN функция - PullRequest
       9

Mysql IN функция

0 голосов
/ 09 октября 2018

class_table

+----+-------+--------------+
| id |teac_id| student_id   |
+----+-------+--------------+
| 1  | 1     | 1,2,3,4      |
+----+-------+--------------+

student_mark

+----+----------+--------+
| id |student_id| marks  |
+----+----------+--------+
| 1  | 1        | 12     |
+----+----------+--------+
| 2  | 2        | 80     |
+----+----------+--------+
| 3  | 3        | 20     |
+----+----------+--------+

У меня есть две таблицы, и я хочу рассчитать итоговые оценки студента, и мой sql:

SELECT SUM(`marks`) 
FROM `student_mark`
WHERE `student_id` IN 
  (SELECT `student_id` FROM `class_table` WHERE `teac_id` = '1')

Но это вернется null, пожалуйста, помогите!

БД скрипка

Ответы [ 3 ]

0 голосов
/ 09 октября 2018

На всякий случай, если вы хотите знать почему. Причина, по которой он возвратил значение null, заключается в том, что подзапрос возвратился как «1,2,3,4» в целом.Вам нужно, чтобы он возвращал 1,2,3,4 по отдельности.

Что вернул ваш запрос

SELECT SUM(`marks`) 
FROM `student_mark`
WHERE `student_id` IN ('1,2,3,4')

Что вы ожидаете, это

SELECT SUM(`marks`) 
FROM `student_mark`
WHERE `student_id` IN (1,2,3,4)

лучший способ это нормализовать, как сказал @madhur.В вашем случае вы должны сделать учитель и ученика ссылкой «один ко многим»

+----+-------+--------------+
| id |teac_id| student_id   |
+----+-------+--------------+
| 1  | 1     | 1            |
+----+-------+--------------+
| 2  | 1     | 2            |
+----+-------+--------------+
| 3  | 1     | 3            |
+----+-------+--------------+
| 4  | 1     | 4            |
+----+-------+--------------+
0 голосов
/ 09 октября 2018

Если вы хотите отфильтровать вашу таблицу на основе списка с разделением запятыми с помощью идентификатора, мой подход заключается в добавлении дополнительных запятых в начале и в конце списка, а также в начале и в конце идентификатора,например.1 становится ,1,, а список становится ,1,2,3,4,.Причина этого заключается в том, чтобы избегать неоднозначных совпадений, таких как 1, совпадений в списке 21 или 12.

Кроме того, EXISTS хорошо подходит в этой ситуации, которая вместе с функцией INSTR должна работать:

SELECT SUM(`marks`) 
FROM `student_mark` sm
WHERE EXISTS(SELECT 1 FROM `class_table` 
             WHERE `teac_id` = '1' AND
             INSTR(CONCAT(',', student_id, ','), CONCAT(',', sm.student_id, ',')) > 0)

Демо

НО вы не должны хранить связанные идентификаторы в одной ячейке как список, разделенный запятыми - это должен быть столбец внешнего ключа для формированияправильное отношение.Тогда присоединения станут тривиальными.

0 голосов
/ 09 октября 2018
  • Во-первых, вы никогда не должны хранить в столбце данные, разделенные запятыми.Вы действительно должны нормализовать свои данные .Таким образом, в принципе, вы можете иметь отображение таблицы «многие ко многим» teacher_to_student, в котором будут столбцы teac_id и student_id.
  • В этом конкретном случае вы можете использовать Find_in_set() функция.

Судя по вашему текущему запросу, вы пытаетесь получить итоговые оценки учителя (суммирование оценок всех его / ее учеников).

Попробуйте:

SELECT SUM(sm.`marks`) 
FROM `student_mark` AS sm
JOIN `class_table` AS ct 
  ON FIND_IN_SET(sm.`student_id`, ct.`student_id`) > 0
WHERE ct.`teac_id` = '1' 

Если вы хотите получить общее количество баллов за одного учащегося, вам нужно будет добавить Group By.Запрос будет выглядеть так:

SELECT sm.`student_id`, 
       SUM(sm.`marks`) 
FROM `student_mark` AS sm
JOIN `class_table` AS ct 
  ON FIND_IN_SET(sm.`student_id`, ct.`student_id`) > 0
WHERE ct.`teac_id` = '1' 
GROUP BY sm.`student_id`
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...