简单的MYSQL数据查询


Simple MYSQL data query?

只是一个非常简单的问题。在我的SQL数据库中,我在表"用户"中有一个名为"friend_count"的列,用于记录登录用户的所有朋友。这与用户id号码,我试图找出如何记录他们所有的工作。下面是我的例子:

USER #29与USER #422成为好友

在user# 29的info列"friend_count"下的用户数据库中,将显示数字"422",如果他与user# 500成为好友,将显示"422,500",以此类推……如果他删除了一个,这个特定的数字就会从盒子中删除。然后,脚本将在用户数据库中搜索这些数字,以显示您的朋友列表。

我该怎么做?什么好主意吗?谢谢!

每当列中有分隔的值列表时,几乎总是表明数据模型不正确。(实际上,我想不出一个例外,但为了安全起见,我将坚持使用"几乎总是"。)

在这种情况下你有两种类型的实体:

    用户
  • 友谊

友谊,虽然不是一个物理对象,但它本身就是一个概念实体。它连接了两个用户,可以添加更多与友谊本身相关的信息,但不一定是两个用户。

你可能有这样的表:

User
--------
ID
Name
etc.
Friendship
--------
ID
OriginatingUser
AcceptingUser
BecameFriendsOn
etc.

所以OriginatingUser可能是发送好友请求的用户,AcceptingUser可能是接受请求的用户。BecameFriendsOn为被接受的日期。您可能希望有状态和其他日期来跟踪待处理请求、拒绝请求等。但所有这些信息都与友谊有关,而不一定与用户有关。

这里你要理解的概念叫做外键。OriginatingUserAcceptingUser列与User表上的ID列的数据类型相同。您将创建Friendship表,使这些列成为User表的外键,这将强制数据的完整性,以便您不能在没有两个有效且现有的User记录的情况下创建Friendship记录。

然后,为了获得好友列表,您将在查询中连接表。也许像这样:

SELECT
  User.Name
FROM
  Friendship
  INNER JOIN User ON Friendship.AcceptingUser = User.ID
WHERE
  Friendship.OriginatingUser = ?
当提供原始用户的ID时,这将获得该用户向其发送好友请求的所有用户的名称。您可以在该查询的基础上进一步构建,以获取向同一用户发送好友请求的用户,等等。通过使用表之间的键外键关系(表代表系统中不同类型的实体),您可以构建非常健壮的查询,以多种不同的方式查看数据。

您正在描述两个实体之间的关系,因此您可以创建一个表来存储该关系的详细信息。

假设您的用户表包含一个userid列和其他列。然后,您可以创建一个朋友表,其中两列都是用户表的外键。

      friends = (user, friend)

因此,对于用户#29获得的每个好友,需要向好友表中添加一行。例如:

<>之前用户我的名字…29岁的山姆30岁的亨利32岁的简朋友用户的朋友29 3029日32之前

Sam是Jane和Henry的朋友,但是Jane和Henry不是朋友

我将创建一个表"friendship",其中包含两个cols "user"answers"friend",然后开始添加用户/朋友id对

users table:Id,用户名,等等

朋友表:Relationship_id, user_id, user_friend_id

获取属于用户好友的id列表的示例查询:

SELECT f.user_friend_id FROM users u 
LEFT JOIN friends f ON f.user_id = u.id
WHERE u.id = {$user_id}

一个非常简单的方法,假设如果UserAUserB成为朋友,那么UserB也会和UserA成为朋友。

通常不推荐使用逗号分隔列表,因为当列表非常大时,它们会变得很麻烦。更简单的方法是,创建一个包含user_idfriend_id列的表friends,其中user_id和friend_id是各自的userid。

现在,当你想添加一个朋友到某人的列表,使用以下命令:

INSERT INTO users (user_id,friend_id) VALUES(UserA,UserB),(UserB,UserA)

现在,当您执行上面的查询时,您将在friends表中有2个新行:

user_id friend_id

UserA UserBUserB UserA

当你想获取一个用户的好友列表时,使用:

SELECT friend_id FROM friends WHERE user_id=(Your user's ID)

这将依次返回一行,因此将为您提供特定用户的所有朋友的id。

现在当你想删除一个朋友时,使用:

DELETE FROM friends WHERE (user_id,friend_id) IN ((user_id,friend_id),(friend_id,user_id))

这将从表中删除这两行,这意味着删除了UserA和UserB之间的关系,并且它们彼此都不是朋友。