如何计算单个表中的数据,并结合多个表中的数据?

时间:2018-03-15 04:48:57

标签: mysql sql

我有3张桌子:

用户 - 使用id,client_id和用户名

maindata - 包含client_id,用户名和说明(每个client_id的许多用户名)以及我需要COUNT的主要数据。

客户端 - 使用client_id和client_name(不是用户名)

我需要从maindata中获取数据,其中包含以下字段:

usernames, client_id, and description 

并查看maindata中的所有记录:使用相同的用户名,client_id和说明显示的数量。

一旦我得到了计数,我需要从maindata中获取与该用户名相关联的user_id。

我觉得我可以在一个SQL调用中执行此操作,但是现在我在获取所有用户的列表后运行for循环(因为它具有用户名和client_id),但我不确定是否需要,我可能能够在我的查询中包含那些。

cur.execute("SELECT * FROM users")
    users = cur.fetchall()
    for u in users:
        user = u[2]
        client_id = u[1]
        cur.execute("SELECT clients.name,maindata.client_id,maindata.username,users.id,COUNT(*) "
                    "FROM maindata CROSS JOIN users "
                    "INNER JOIN clients ON maindata.client_id=clients.id "
                    "WHERE description LIKE '%teal%' "
                    "AND maindata.username='{}' AND maindata.client_id='{}' ".format(user,client_id)) #This will return the client and the number of countableDatas
        totalCountswithIDs = cur.fetchall()

所以最终结果应该是返回值:

  • 客户名称(在客户中找到)
  • 客户ID(在maindata中找到)
  • 用户名(在maindata中找到)
  • 用户ID(在用户中找到)
  • 计数(适用于客户ID +用户名+指定说明的所有组合)

我远吗?感谢您提前提供任何帮助!

示例数据:

maindata:
id, client_id, username, description
(1, '1', 'rusty', 'blue'),
(2, '2', 'john', 'yellow brick road'),
(3, '3', 'helen', 'teal'),
(4, '3', 'helen', 'teal'),
(5, '3', 'helen', 'teal'),

users:
id, client_id, username
(1743, 2, 'john'),
(1742, 3, 'helen'),
(1189, 1, 'rusty'),

clients:
id, name
(1, 'Apple'),
(2, 'Amazon'),
(3, 'Google'),

这样的结果将是:

  • Apple,1,生锈,1189,1
  • 亚马逊,2,约翰,1743年,1
  • Google,3,helen,1742,3

最后一个有3个,因为有3个匹配我的LIKE搜索“teal”,作为一个例子。

1 个答案:

答案 0 :(得分:0)

如果我理解你的问题,这将是一种方法

with users as (
Select 1743 id, 2 client_id ,'john' username UNION ALL
Select 1742 id, 3 client_id ,'helen' username UNION ALL
Select 1189 id, 1 client_id ,'rusty' username 
)
,
maindata as
(
SELECT 1 id , '1' client_id, 'apple' username , 1520900834 DontKnown, 'blue'     description UNION ALL
SELECT 2, '2', 'admin', 1520901427, 'yellow brick road' UNION ALL
SELECT 3, '3', 'helen', 1520902247, 'teal' UNION ALL
SELECT 4, '3', 'helen', 1520902243, 'teal' UNION ALL
SELECT 5, '3', 'helen', 15202022347, 'teal'
),
clients as
(Select 1 client_id ,'Apple' name union all
Select 2,'Amazon' UNION ALL
Select 3,'Google'
) --Apple, 1, rusty, 1189, 1 Amazon, 2, john, 1743, 1 Google, 3, helen,     1742, 3
select distinct c.name,c.client_id,u.username,u.id,m.cnt_maindata
FROM 
(
Select *,count(*) OVER(PARTITION BY client_id,description) cnt_maindata from     maindata
) m
JOIN users u on m.client_id=u.client_id
JOIN clients c on c.client_id=m.client_id

输出:

name    client_id   username    id  cnt_maindata
Amazon  2           john        1743    1
Apple   1           rusty       1189    1
Google  3           helen       1742    3