Mysql - SUM Column - подзапрос возвращает более 1 строки

0

Я хочу посчитать часы наших членов, где они нам помогли. Таблица выглядит так:

    CREATE TABLE 'stunden' (
  'std_id' int(11) NOT NULL AUTO_INCREMENT,
  'user_id' int(11) NOT NULL,
  'einsatz_id' int(11) NOT NULL,
  'stunden' decimal(5,1) NOT NULL DEFAULT '0.0',
  'last_update' timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY ('std_id')
) ENGINE=InnoDB;

INSERT INTO stunden VALUES
(1,1,2,1.0,'2018-01-19 00:36:15'),
(2,2,2,1.0,'2018-01-19 00:36:15'),
(3,4,2,1.0,'2018-01-19 00:36:15'),
(4,1,1,2.0,'2018-01-19 00:36:37'),
(5,5,1,2.0,'2018-01-19 00:36:37'),
(6,1,2,2.5,'2018-01-20 12:00:36');

 mysql> select * from stunden;
+--------+---------+------------+---------+---------------------+
| std_id | user_id | einsatz_id | stunden | last_update         |
+--------+---------+------------+---------+---------------------+
|      1 |       1 |          2 |     1.0 | 2018-01-19 00:36:15 |
|      2 |       2 |          2 |     1.0 | 2018-01-19 00:36:15 |
|      3 |       4 |          2 |     1.0 | 2018-01-19 00:36:15 |
|      4 |       1 |          1 |     2.0 | 2018-01-19 00:36:37 |
|      5 |       5 |          1 |     2.0 | 2018-01-19 00:36:37 |
|      6 |       1 |          2 |     2.5 | 2018-01-20 12:00:36 |
+--------+---------+------------+---------+---------------------+
6 rows in set (0,00 sec)

Вы можете видеть, что член с user_id = 1, был доступен два раза по einsatz_id = 2 и один раз в einsatz_id = 1. Мне нужна сумма stunden (stunden = hours) за einsatz_id и за user_id. Я попытался выполнить следующий запрос.

SELECT 
(SELECT SUM(s.stunden) AS Zeit FROM stunden s GROUP BY s.user_id, s.einsatz_id) AS STUNDEN,
    m.nachname,
    m.vorname,
    a.einsatz
FROM
    stunden s,
    mitglieder m,
    arbeitseinsatz a
WHERE
    s.user_id = m.id
        AND s.einsatz_id = a.einsatz_id
GROUP BY s.user_id, s.einsatz_id
ORDER BY m.nachname , m.vorname ASC

В результате появляется следующее сообщение об ошибке:

"ERROR 1242 (21000): Subquery returns more than 1 row". 

Любая помощь будет оценена по достоинству.

  • 1
    Если ONLY_FULL_GROUP_BY отключен, расширение MySQL для стандартного использования SQL GROUP BY позволяет списку выбора, условию HAVING или списку ORDER BY ссылаться на неагрегированные столбцы, даже если столбцы функционально не зависят от столбцов GROUP BY. Это заставляет MySQL принять предыдущий запрос. В этом случае сервер может выбрать любое значение из каждой группы, поэтому, если они не совпадают, выбранные значения являются неопределенными, что, вероятно, не то, что вам нужно. dev.mysql.com/doc/refman/5.7/en/group-by-handling.html
  • 0
    stackoverflow.com/questions/28171474/...
Показать ещё 2 комментария
Теги:

3 ответа

0

Я нашел решение для этого, мне пришлось отключить ONLY_FULL_GROUP_BY следующим образом, я добавил две строки в /etc/mysql/my.cnf.

[mysqld]
sql_mode = "STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

Я изменил запрос на "JOIN", только для того, чтобы потреблять меньше ресурсов (благодаря сообщению Platypus).

SELECT 
    SUM(s.stunden), m.nachname, m.vorname, a.einsatz
FROM
    stunden s
        JOIN
    mitglieder m ON s.user_id = m.id
        JOIN
    arbeitseinsatz a ON s.einsatz_id = a.einsatz_id
GROUP BY a.einsatz_id , s.user_id
ORDER BY m.nachname , m.vorname , a.einsatz DESC;
0

Я вижу, что вы пытаетесь сделать, я еще не вижу ошибку. Но я могу сказать, что вы должны использовать JOIN. Когда вы выполните:

FROM
stunden s,
mitglieder m,
arbeitseinsatz a
WHERE
s.user_id = m.id

Это реально потребляет ресурсы, потому что он делает скалярный продукт.

SELECT whatever
FROM utilisateur
(LEFT/RIGHT) JOIN arbeitseinsatz ON stunden.einsatz_id = arbeitseinsatz.einsatz_id

Или что-то вроде этого, замените (слева или справа) на то, что вы хотите использовать, есть много документации по этому вопросу.

Разница может быть не видна в небольших базах данных, но по более крупным проектам она должна значительно улучшить производительность. И если вы будете использовать больше таблиц, это сделает ваш код более чистым и масштабируемым.

Я знаю, что не ответ, который вы ожидали, но надеюсь, что вы что-то узнали.

0

Если это не то, что вам нужно, пожалуйста, внесите изменения в свой вопрос, как описано выше...

SELECT user_id, einsatz_id, SUM(stunden) total FROM stunden GROUP BY user_id, einsatz_id;
+---------+------------+-------+
| user_id | einsatz_id | total |
+---------+------------+-------+
|       1 |          1 |   2.0 |
|       1 |          2 |   3.5 |
|       2 |          2 |   1.0 |
|       4 |          2 |   1.0 |
|       5 |          1 |   2.0 |
+---------+------------+-------+

Ещё вопросы

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