Mysql SQL查询返回不正确的计数
我试图通过使用MySQL查询获取应用程序中所有功能的计数和功能名称。以下是查询: 从判断任务t1中选择t2.feature,countt2.feature作为计数,批准t2,其中t1.application\u name='Retail Bank Portal'和t2.gap\u status=1按功能分组; 以下是我的表格说明: 表2.1.1.1任务 表批准 两个表之间没有像外键那样的关系。数据库是由其他人设计的,现在无法更新,因为应用程序即将完成。更新数据库会干扰整个应用程序设计。 以下是查询结果:Mysql SQL查询返回不正确的计数,mysql,Mysql,我试图通过使用MySQL查询获取应用程序中所有功能的计数和功能名称。以下是查询: 从判断任务t1中选择t2.feature,countt2.feature作为计数,批准t2,其中t1.application\u name='Retail Bank Portal'和t2.gap\u status=1按功能分组; 以下是我的表格说明: 表2.1.1.1任务 表批准 两个表之间没有像外键那样的关系。数据库是由其他人设计的,现在无法更新,因为应用程序即将完成。更新数据库会干扰整个应用程序设计。 以下是查
+---------+-----+
| feature | app |
+---------+-----+
| S3 | 175 |
| Login | 875 |
+---------+-----+
原始计数如下:
S3=1,
登录名=5
我没有得到确切的查询来得到我的结果。你能建议我更正一下我的问题吗?我应该如何更新它以获得结果?谢谢
更新1
这里是judge_任务的示例数据
| 100173 | 4 | Retail Bank Portal | 16 | Login | 1 |
| 100203 | -1 | Retail Bank Portal | 16 | Login | 2 |
| 100204 | 4 | Retail Bank Portal | 19 | Bill Pay | 2 |
| 100205 | -1 | Retail Bank Portal | 16 | Login | 2 |
| 100206 | -1 | Retail Bank Portal | 16 | Login | 2 |
| 100207 | -1 | Retail Bank Portal | 16 | Login | 2 |
| 100208 | -1 | Retail Bank Portal | 16 | Login | 2 |
| 100209 | -1 | Retail Bank Portal | 22 | S3 | 2 |
批准的样本数据
我已经根据示例数据更新了表定义,删除了不相关的列。谢谢
更新
有一件事我忘了提到,数据必须从approve表中选择,只有应用程序名称才能从judge_任务中选择。您正在对查询执行隐式交叉联接,这意味着表A中的所有行都在后台与表B合并 首先找到可以显式连接表feature\u id=feature.id的方法
使用显式联接内部联接、左联接、右联接等,而不是在FROM子句中使用隐式联接列出带有comas的表。首先:在查询中联接两个表不需要外键。您所需要的只是两个表中具有相同数据的字段,该字段允许创建此关系,例如,TaskID或类似的内容。字段名称不一定相同。 表中允许在表中创建此连接的字段只有:judge_task.feature_name和approve.feature。我想我们可以试试这个查询:
select t2.feature, count(t2.id) from judge_task as t1
join approve as t2 on t2.feature = t1.feature_name
where t1.application_name='Retail Bank Portal' AND t2.gap_status=1
group by feature;
如果您的表有许多行,我建议您在judge_task.feature_name和approve.feature以及judge_task.application_name上创建索引,以提高性能。以下是我进行查询的方法:
+---------+-----+
| feature | app |
+---------+-----+
| S3 | 175 |
| Login | 875 |
+---------+-----+
选择不同的
t、 特征,t.特征
法官的任务
内连接
选择
app.feature,计数*为feature\u计数
从批准应用程序
其中app.gap_status=1
按app.feature分组
t.feature=judge_task.feature_name上的t
其中judge_task.application_name='零售银行门户'
;
你可以从中看到结果
通过内部选择,您可以避免由于与approve表的笛卡尔积而导致结果重复当然,这两个表之间存在某种关系。如果没有,那么你将不得不进行交叉连接,这不是你想要的。@MatBailie对此表示抱歉。你能建议这里应该使用哪个连接吗?那真是太好了helpful@TimBiegeleisen那么我应该在这里用什么呢?谢谢如果您有一些示例数据,它将非常有用。您显然从judge_任务表中获得175行,而从approve表中仅获得6行。首先,我会目视检查这些行,确定您想要的结果,然后使用一些示例数据更新这个问题。我是否可以从当前的表模式中获得任何方法?它返回以下内容:| Login | 285 | | S3 | 3 |这看起来不像是正确的查询。这对我来说是一种全新的查询方式,因为我已经离开数据库一年多了。
| 59 | Login | 1 |
| 60 | Login | 1 |
| 115 | Login | 1 |
| 116 | Login | 1 |
| 117 | Login | 3 |
| 118 | Login | 3 |
| 119 | Login | 3 |
| 120 | Login | 3 |
| 121 | Login | 3 |
| 122 | Login | 3 |
| 123 | Login | 3 |
| 124 | Login | 3 |
| 125 | Login | 3 |
| 126 | Login | 3 |
| 127 | Login | 3 |
| 128 | Login | 1 |
| 129 | S3 | 1 |
+-----+-------------------------+------------+
select t2.feature, count(t2.id) from judge_task as t1
join approve as t2 on t2.feature = t1.feature_name
where t1.application_name='Retail Bank Portal' AND t2.gap_status=1
group by feature;