【问题标题】:MySQL Join on LIKE statementMySQL Join on LIKE 语句
【发布时间】:2016-09-13 04:20:03
【问题描述】:

我需要计算数据库中每个组中有多少用户。不幸的是,数据库设计不是很好,用户 uid 存储在组表中的组表中的 LONGTEXT 字段列名 owncloudusers 中。 owncloudusers 数据示例:

{i:0;s:36:"25C967BD-AF78-4671-88DC-FAD935FF1B26";i:1;s:36:"40D6866B-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 列

我已经尝试了一些我在stackoverflow CONCAT 上找到的LIKE 连接和LIKE('%:"'+T2.owncloud_name+'";%') 的方法

但没有快乐。我当前的语句针对所有组返回 0 个用户,但我知道这是不对的。

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

任何帮助将不胜感激。

【问题讨论】:

  • 感谢您的回复我已经尝试了上面的方法并且它运行没有错误但是,同样的问题计数返回 0

标签: mysql join sql-like owncloud


【解决方案1】:

我认为你需要一个简单的

    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;

【讨论】:

  • 您好,感谢您的回复,不幸的是,如果您执行上述操作,它不会简单地尝试将 T2.owncloud_name 读取为字符串而不是我想要的 uid 吗?
  • 感谢 scaisEdge 你的传奇 我对我尝试过的一些方法非常接近 我错过了 concat doh 中的 ,​​,。
【解决方案2】:

你很接近,但 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;

【讨论】:

  • 您好,感谢您的回复,当我尝试上述方法时,它给了我以下错误:操作数应包含 1 列。有什么想法吗?
  • @N_E 哎呀...忽略了CONCAT()。立即尝试。
【解决方案3】:

如果没有任何性能问题, 你能用子查询试试吗,

    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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-17
    • 1970-01-01
    • 2012-06-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多