如果人 1 不喜欢人 2,则无需将人 1 显示给人 2。即使您显示他,他们也永远不会匹配。因此,您的计算 1K x 1K = 1M 有点高估了。
但是,如果您仍然想为两个用户设置喜欢/不喜欢的集合,您可能会考虑这种“压缩”行的可怕想法。
想象一下,你有一个这样的序列:
| Person 1 | Person 2 | Op |
| -------- | -------- | --------- |
| 0001 | 1010 | Dislike |
| 0001 | 1011 | Dislike |
| 0001 | 1012 | Dislike |
| 0001 | 1013 | Dislike |
| 0001 | 1015 | Like |
| 0001 | 1017 | Dislike |
| 0001 | 1018 | Dislike |
| 0001 | 1019 | Dislike |
| 0001 | 1021 | Like |
如果您有彼此关注的 id,您可能会将它们显示为
| Person 1 | Person 2 | Op | N |
| -------- | -------- | --------- | ---- |
| 0001 | 1010 | Dislike | 3 |
| 0001 | 1015 | Like | 0 |
| 0001 | 1017 | Dislike | 2 |
| 0001 | 1021 | Like | 0 |
其中 N 是序列中的最大 id(例如 1010 + 3 = 1013)。如果将 N 定义为无符号 tinyint,则序列的最大可能大小可以是 255,这意味着,理论上,可以将 255 个连续的不喜欢/喜欢保存为 1 条记录。
查询将是这样的(假设您正在寻找 id 1013):
SELECT a.*
FROM (
SELECT *
FROM `table`
WHERE person_1 = 0001
AND person_2 >= (1013 - 255) -- 255 is a max size of a sequense
AND person_2 <= 1013
) a
WHERE a.person_2 <= 1013 AND a.person_2 + N >= 1013
子选择将限制可能记录的范围,然后主选择将匹配记录(如果存在)。在这种情况下,它将是
| Person 1 | Person 2 | Op | N |
| -------- | -------- | --------- | ---- |
| 0001 | 1010 | Dislike | 3 |
但是,就个人而言,我会选择这个并更喜欢您当前的解决方案,因为它很简单。
或者作为另一种变体,您可以通过这种方式压缩表格
| Person 1 | Person 2 | Max Person 2 | Op |
| -------- | -------- | ------------ | --------- |
| 0001 | 1010 | 1013 | Dislike |
| 0001 | 1015 | 1015 | Like |
| 0001 | 1017 | 1019 | Dislike |
| 0001 | 1021 | 1021 | Like |