首页 > 解决方案 > 如何获取所有推荐次数超过 100 的用户?

问题描述

我有一个具有推荐系统的服务。服务的数据库中有一个表users,其中包含idreferrers列。列referrer 包含一串以. 分隔的referrer id ,。这是该表中的示例数据:

+------+---------------+
| id   | referrers     |
+------+---------------+
|    1 | 1             |
|    7 | 1             |
|    8 | 1             |
|    9 | 1             |
|   10 | 7,1           |
|   11 | 1             |
|   12 | 7,1           |
|   13 | 1             |
|   14 | 9,1           |
|   20 | 7,1           |

我需要 smt like: SELECT id, login FROM users u WHERE id IN (SELECT id FROM users u1 WHERE *referrers count more than 1000*),但我不明白我应该在*..*. 为了更清楚地看到这种情况,我需要从第一个查询中获取当前用户 id 并将其添加到子查询中的%LIKE%语句中,但是如何?喜欢:

`SELECT 
id, login 
FROM users u 
WHERE id IN 
  (SELECT id FROM users u1 WHERE count((SELECT * FROM users u2 WHERE refer LIKE %u1.id%) > 1000)` 

但是如何以正确的方式做到这一点?

标签: mysqlsqlcsv

解决方案


您可以为此使用字符串函数:

select id, login
from users
where char_length(referrers) - char_length(replace(referrers, ',', '')) >= 99

,这通过计算可以在列中找到多少来起作用referrers:99 个逗号表示有 100 个值。

最重要的是,您应该修复您的数据模型:您应该有一个单独的表来存储用户/引用者元组,而不是使用分隔列表,每行一个元组。在表列中存储分隔列表是关系数据库中的典型反模式,通常应该避免:您可以在这篇著名的 SO 帖子中阅读更多相关信息。


推荐阅读