我需要计算数据库中每个组中有多少用户。遗憾的是,数据库设计并不好,用户uid存储在LONGTEXT字段列名owncloudusers的组表中的组中。 owncloudusers数据示例:
{I:0; S:36:" 25C967BD-AF78-4671-88DC-FAD935FF1B26&#34 ;; I:1; S:36:" 40D6866B-EA06-4F39-B509-8CE551CC1924& #34 ;; I:2; S:36:" 7724C600-DE23-45C8-8BFD-326B0138E029&#34 ;; I:3; S:36:" D6FF37EC-11F4-471F-94C9-F3A28416CF1F& #34 ;; I:4; S:36:" F70C6D03-B7BA-44E4-B703-9AF3EED9BC03&#34 ;;}
我以为我可以在联接中使用带有LIKE的查询来比较用户的uid并查看自己的内容并查看是否存在匹配。
我最接近的是:
SELECT T1.owncloudname, count(T2.owncloud_name) AS Users
FROM oc_ldap_group_members T1
LEFT JOIN oc_ldap_user_mapping T2 ON T1.owncloudusers LIKE('%:"'||T2.owncloud_name||'";%')
GROUP BY owncloudname;
T1表包含分组以及标记到该组的人员 T2表保存用户数据。 column owncloud_name是用户uid列
我尝试了一些我在LIKE join和LIKE上的stackoverflow CONCAT上找到的方法('%:"' + T2.owncloud_name +'&#34 ;;% ')
但没有快乐。我当前的声明给所有组返回了0个用户,但我知道这不对。
我知道的很多但是关于加入的问题不确定下一步该怎么做。
非常感谢任何帮助。
答案 0 :(得分:2)
我认为你需要一个简单的
SELECT T1.owncloudname, count(*) AS Users
FROM oc_ldap_group_members T1
LEFT JOIN oc_ldap_user_mapping T2 ON T1.owncloudusers LIKE '%T2.owncloud_name%'
GROUP BY owncloudname;
如果你需要连续尝试
SELECT T1.owncloudname, count(T2.owncloud_name) AS Users
FROM oc_ldap_group_members T1
LEFT JOIN oc_ldap_user_mapping T2 ON T1.owncloudusers
LIKE concat( '%',T2.owncloud_name,'%' )
GROUP BY owncloudname;
答案 1 :(得分:1)
你很接近,但是mysql不理解||
作为文本连接运算符;使用CONCAT()
将文本部分作为值列表传递以构建LIKE
操作数:
SELECT T1.owncloudname, count(T2.owncloud_name) AS Users
FROM oc_ldap_group_members T1
LEFT JOIN oc_ldap_user_mapping T2
ON T1.owncloudusers LIKE CONCAT('%;', T2.owncloud_name, ';%')
GROUP BY owncloudname;
答案 2 :(得分:0)
如果没有任何性能问题, 你可以用子查询来试试吗,
SELECT
T1.owncloudname,
(SELECT COUNT(*)
FROM oc_ldap_user_mapping AS T2
WHERE LOCATE(T2.owncloud_name,T1.owncloudusers)=1) AS Users
FROM
oc_ldap_group_members T1
GROUP BY
owncloudname;