Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 将我的查询概括为在所有数据上运行,而不是在特定id上运行_Mysql_Mariadb - Fatal编程技术网

Mysql 将我的查询概括为在所有数据上运行,而不是在特定id上运行

Mysql 将我的查询概括为在所有数据上运行,而不是在特定id上运行,mysql,mariadb,Mysql,Mariadb,我有一个特定的查询,当我硬编码它应该为之运行的ID时,它就可以工作了。我想为数据库中的所有ID运行它 这是一个具有代表性的设置: CREATE TABLE `dummy` ( `total` INT(11) NULL DEFAULT NULL, `a_id` INT(11) NULL DEFAULT NULL, `month` INT(11) NULL DEFAULT NULL ); Data: total | a_id | month 2 | 1 |

我有一个特定的查询,当我硬编码它应该为之运行的ID时,它就可以工作了。我想为数据库中的所有ID运行它

这是一个具有代表性的设置:

CREATE TABLE `dummy` (
    `total` INT(11) NULL DEFAULT NULL,
    `a_id` INT(11) NULL DEFAULT NULL,
    `month` INT(11) NULL DEFAULT NULL
);

Data:

total | a_id | month
2     | 1    | 3
4     | 1    | 5
3     | 1    | 6
6     | 1    | 9
3     | 2    | 4
6     | 2    | 10


CREATE TABLE `months` (
    `month` INT(11) NULL DEFAULT NULL
);

Data: Just the values 1 through 12
我想要实现的是使用月份作为时间戳,对于每个a_id,得到该月份的总数,对于未设置的月份,只有在a_id的第一个月和最后一个月之间,为零

到目前为止,我的问题是:

SELECT c.month, COALESCE(d.total, 0) AS 'total', COALESCE(d.a_id, 1) AS 'a_id'
FROM (
    SELECT month
    FROM months
    WHERE month >= (SELECT MIN(month) FROM dummy WHERE a_id = 1)
    AND month <= (SELECT MAX(month) FROM dummy WHERE a_id = 1)
) c
LEFT outer JOIN (
    SELECT *
    FROM dummy
    WHERE a_id = 1
) d ON d.month = c.month
ORDER BY c.month;
如果没有像PHP这样的外部程序每次都更改id,如何更改此查询并获取表中每个a_id的输出?

您似乎需要

选择months.month, 共0.0,共0, a_id.a_id 从几个月 交叉连接选择不同的a\u id 来自虚拟a_id 左连接虚拟月数。月数=虚拟月数 和a_id.a_id=dummy.a_id 内部联接选择最小月最小月, 最大月最大月 从月上的虚拟边界。边界之间的月。最小月 和borders.max_月 按a_id.a_id订购,月.month; 或

选择months.month, 共0.0,共0, a_id.a_id 从几个月 交叉连接选择不同的a\u id 来自虚拟a_id 左连接虚拟月数。月数=虚拟月数 和a_id.a_id=dummy.a_id 内部联接选择最小月最小月, 最大月最大月, 身份证 来自虚拟 按a_id分组月边界。月边界之间。最小月 和borders.max_月 a_id.a_id=borders.a_id 按a_id.a_id订购,月.month; 看来你需要

选择months.month, 共0.0,共0, a_id.a_id 从几个月 交叉连接选择不同的a\u id 来自虚拟a_id 左连接虚拟月数。月数=虚拟月数 和a_id.a_id=dummy.a_id 内部联接选择最小月最小月, 最大月最大月 从月上的虚拟边界。边界之间的月。最小月 和borders.max_月 按a_id.a_id订购,月.month; 或

选择months.month, 共0.0,共0, a_id.a_id 从几个月 交叉连接选择不同的a\u id 来自虚拟a_id 左连接虚拟月数。月数=虚拟月数 和a_id.a_id=dummy.a_id 内部联接选择最小月最小月, 最大月最大月, 身份证 来自虚拟 按a_id分组月边界。月边界之间。最小月 和borders.max_月 a_id.a_id=borders.a_id 按a_id.a_id订购,月.month;
@Akina,因为1的_id只在其最小值和最大值之间,所以3和9@Akina因为1的_id只在最小值和最大值之间,所以3和9是第二个解决方案,适用于3-9和4-10。谢谢我无法通过正确的连接来获得我想要的结果,但您已经重写了所有内容以获得相同的结果,而且更清楚。@Tominator在大多数情况下,调整现有解决方案比创建新解决方案更昂贵。这是第二个适用于我的3-9和4-10解决方案。谢谢我无法通过正确的连接来获得我想要的结果,但您已经重写了所有内容以获得相同的结果,而且更清楚。@Tominator在大多数情况下,调整现有解决方案比创建新解决方案更昂贵。
month | total | a_id
3     | 2     | 1
4     | 0     | 1
5     | 4     | 1
6     | 3     | 1
7     | 0     | 1
8     | 0     | 1
9     | 6     | 1