我有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()
所以最终结果应该是返回值:
我远吗?感谢您提前提供任何帮助!
示例数据:
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'),
这样的结果将是:
最后一个有3个,因为有3个匹配我的LIKE搜索“teal”,作为一个例子。
答案 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