我想要算上我们会员的时间,他们在哪里帮助我们。表格如下:
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处可用一次。我需要的是每个einsatz_id和每个user_id的stunden(stunden = hours)的总和。我尝试过以下查询。
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".
任何帮助都将不胜感激。
答案 0 :(得分: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 |
+---------+------------+-------+
答案 1 :(得分: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
或类似的东西,用你想要的东西替换(左或右),有很多关于这个主题的文件。
差异可能在小型数据库中不可见,但在较大的项目上,它应该相当多地提高性能。如果您使用更多表格,它将使您的代码更清晰,更具可扩展性。
我知道这不是你想要的答案,但希望你能学到一些东西。
答案 2 :(得分: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;