Я хочу посчитать часы наших членов, где они нам помогли. Таблица выглядит так:
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".
Любая помощь будет оценена по достоинству.
Я нашел решение для этого, мне пришлось отключить 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;
Я вижу, что вы пытаетесь сделать, я еще не вижу ошибку. Но я могу сказать, что вы должны использовать 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
Или что-то вроде этого, замените (слева или справа) на то, что вы хотите использовать, есть много документации по этому вопросу.
Разница может быть не видна в небольших базах данных, но по более крупным проектам она должна значительно улучшить производительность. И если вы будете использовать больше таблиц, это сделает ваш код более чистым и масштабируемым.
Я знаю, что не ответ, который вы ожидали, но надеюсь, что вы что-то узнали.
Если это не то, что вам нужно, пожалуйста, внесите изменения в свой вопрос, как описано выше...
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 |
+---------+------------+-------+