Mysql - SUM列 - 子查询返回超过1行

时间:2018-01-20 13:45:00

标签: mysql

我想要算上我们会员的时间,他们在哪里帮助我们。表格如下:

    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". 

任何帮助都将不胜感激。

3 个答案:

答案 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;