2016-05-17 116 views
3

我需要统计数据库中每个组中有多少用户。不幸的是,数据库设计不是很好,用户的uid是针对LONGTEXT字段列名owncloudusers中的组表进行存储的。 owncloudusers数据的 示例:MySQL LIKE语句加入

{I:0; S:36: “25C967BD-AF78-4671-88DC-FAD935FF1B26”; I:1; S:36:“40​​D6866B-EA06-4F39-B509- 8CE551CC1924 “; I:2; S:36:” 7724C600-DE23-45C8-8BFD-326B0138E029​​ “; I:3; S:36:” D6FF37EC-11F4-471F-94C9-F3A28416CF1F“; I​​:4; S:36 :“F70C6D03-B7BA-44E4-B703-9AF3EED9BC03”;}

我以为我可以使用查询与LIKE在加入比较用户的UID和往里owncloudusers,看看是否有匹配。

我已经得到的最接近的是:

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表保存用户的数据。列owncloud_name是用户的UID列

我已经试过我的计算器CONCAT发现了LIKE加入和LIKE( '%: “ '+ T2.owncloud_name +'”;%')的几个方法

但是,没有喜悦。目前的声明我已经返回0个用户反对所有组,但我知道这是不正确的。

我知道它很多,但加入的一个问题不知道下一步该去哪里。

任何援助将不胜感激。

+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; 

如果您需要CONCAT尝试

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; 
+0

嗨,谢谢你的答复不幸的是,如果你这样做不是简单地尝试读取T2.owncloud_name作为一个字符串,而不是我想要的uid? –

+0

我已更新答案 – scaisEdge

+0

谢谢scaisEdge你的传奇我真的很接近我尝试过的一些方法我错过了,在concat doh。 –

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; 
+0

嗨,感谢您的回复,当我尝试上述时,它给了我以下错误:操作数应该包含1列(s)。有任何想法吗? –

+0

@N_E Ooops ...遗漏了'CONCAT()'。现在就试试。 – Bohemian

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;