带有限制偏移的FIND_IN_SET

时间:2016-04-05 11:50:09

标签: mysql sql

直接进入代码。

用户表

+----+------------------+
| id | username         |
+----+------------------+
|  1 | becker.cornelius |
|  2 | claudine29       |
|  3 | dion37           |
|  4 | zkozey           |
|  5 | kasandra59       |
+----+------------------+

列出表格

+----+---------------------------+
| id | name                      |
+----+---------------------------+
| 1 | List 1                     |
| 2 | List 2                     |
| 3 | List 3                     |
| 4 | List 4                     |
| 5 | List 5                     |
+----+---------------------------+

lists_data table

+-----+---------+----------------------------------------------------------------+
| id  | list_id | user_id                                                        |
+-----+---------+----------------------------------------------------------------+
| 421 |      4 | 1,2,3,503433,707152,603114,342531,414463,977165                |
+-----+---------+----------------------------------------------------------------+

data colum我包含100万用户。以下是我的代码

select users.id, email, mobilenumber, firstname, surname, created_at
from users
inner join lists_data on find_in_set(users.id,lists_data.user_id) > 0 where lists_data.list_id = 97

以上代码正常,只有问题很慢,我不能使用分页,<​​/ p>

我尝试了很多方法。他们都没有像预期的那样工作。

BTW,我无法规范化lists_data表,因为它可能包含每个列表数百万条记录。

1 个答案:

答案 0 :(得分:0)

您对关系数据库使用了错误的数据结构。您的lists_data表格应包含list_iduser_id(单数)的列。示例行将是多行:

 id    list_id   user_id 
  1        97          1
  2        97          2
  3        97          3
  4        97     503433
  . . .

这称为联结表。而且,虽然更大,但SQL发现使用这些表格要简单得多。