在Tinder上,当两个成员彼此喜欢时,他们就是"匹配",能够进行交流。如果只有一个成员喜欢另一个,那么这就不匹配。
我正试图将这个"Like"系统存储在MySQL中,但无法找到高效的最佳方法。这是我现在的设置。
mysql> desc likes_likes;
+--------------+----------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------------+----------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| from_user_id | int(11) | NO | MUL | NULL | |
| to_user_id | int(11) | NO | MUL | NULL | |
| value | int(11) | NO | | NULL | |
| created_at | datetime | NO | | NULL | |
| updated_at | datetime | YES | | NULL | |
+--------------+----------+------+-----+---------+----------------+
6 rows in set (0.00 sec)
要查找匹配项,我会查询以下内容。。。
SELECT to_user_id FROM likes_likes WHERE from_user_id = my_id AND value = 1 AND .... I don't know how to join the same table from here.
如何对此表执行查询?如果效率不高,有什么更好的结构来存储这个模型?
1喜欢,0不喜欢。这是仅有的两个值。
SELECT A.from_user_id AS userA, B.from_user_id AS userB
FROM likes_likes A
JOIN likes_likes B
ON A.from_user_id = B.to_user_id
AND A.to_user_id = B.from_user_id
AND A.id <> B.id
WHERE A.value = 1
AND B.value = 1
要查找匹配项,可以使用别名为的常规联接
SELECT l1.from_user_id user1, l2.from_user_id user2
FROM likes_likes l1
INNER JOIN likes_likes l2 ON
l2.from_user_id = l1.to_user_id AND
l1.to_user_id = l2.from_user_id AND
l1.value = 1 AND l2.value = 1
第一个条件检查人user1
是否喜欢user2
以及user2
是否喜欢至少一个其他人。
第二个条件完成了检查,因此我们现在有两个人对彼此发表了意见。
最后两项检查确保它们都喜欢对方:)
这里有一种方法,使用group by least(),greatest()
将每个唯一的用户对放入一个组中,然后检查每个组是否有2行
select least(from_user_id,to_user_id), greatest(from_user_id,to_user_id)
from likes_likes
where value = 1
-- and my_id in (from_user_id,to_user_id)
group by least(from_user_id,to_user_id), greatest(from_user_id,to_user_id)
having count(*) = 2
如果同一用户对另一用户可以有多个点赞(即用户"A"对用户"B"点赞两次),则使用having count(distinct from_user_id) = 2
您真的需要value
吗?如果没有争吵,就没有相似之处。从这个查询中,您应该得到1
表示匹配,0
表示不相互匹配。
SELECT
COUNT(*)
FROM
likes_like i_like_you
JOIN likes_like you_like_me ON i_like_you.to_user_id = you_like_me.from_user_id
WHERE
i_like_you.from_user_id = @my_id
AND you_like_me.from_user_id = @your_id
id
有什么原因吗?看起来这对(from_user_id
,to_user_id
)应该是唯一的,因此可能是"自然的"PRIMARY KEY
。
我还没有看到任何关于需要value
的好论据。
因此,该表已缩小为
CREATE TABLE likes_likes (
from_user_id ...,
to_user_id ...,
created_at ...,
updated_at ...,
PRIMARY KEY(from_user_id, to_user_id), -- serves as the necessary INDEX.
) ENGINE=InnoDB;
SELECT A.from_user_id AS userA,
B.from_user_id AS userB
FROM likes_likes A
JOIN likes_likes B
ON A.from_user_id = B.to_user_id
AND A.to_user_id = B.from_user_id
(我假设你不允许一个人喜欢他自己。)