简单的MYSQL数据查询?

时间:2014-05-09 17:59:10

标签: php html mysql

这是一个非常简单的问题。在我的SQL数据库中,我有一个名为" friend_count"的列。在表格#34;用户"记录登录用户拥有的所有朋友。这适用于UserID号码,我试图弄清楚如何记录它们。这是我的榜样:

USER#29成为USER#422的朋友

在" friend_count"列中的USER#29信息下的用户数据库中然后将有#34; 422",如果他随后成为用户#500的朋友,它将显示" 422,500"等等......如果他删除了一个,那么该特定号码就会被删除。然后,该脚本将通过用户数据库搜索这些数字,以显示您与朋友在一起的人员列表。

我该怎么做?有任何想法吗?谢谢!

5 个答案:

答案 0 :(得分:3)

每当您在列中有一个分隔的值列表时,几乎总是表示数据模型不正确。 (实际上,我不能想到这个例外,但我会坚持“几乎总是”只是为了安全。)

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

  • 用户
  • 友谊

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

所以你可能有这样的表:

User
--------
ID
Name
etc.

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

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

您希望在此理解的概念称为外键。 OriginatingUserAcceptingUser列与ID表中的User列的数据类型相同。您将创建Friendship表,以使这些列是User表的外键,这会强制数据的完整性,这样您就无法创建Friendship记录而没有两个有效和现有的User条记录。

然后,要获取朋友列表,您将在查询中加入表。也许是这样的:

SELECT
  User.Name
FROM
  Friendship
  INNER JOIN User ON Friendship.AcceptingUser = User.ID
WHERE
  Friendship.OriginatingUser = ?

当提供原始用户的ID时,这将获得该用户向其发送朋友请求的所有用户名。您可以进一步构建查询,以便向同一用户发送朋友请求的用户,等等。通过利用表示系统中不同类型实体的表之间的关键外键关系,您可以构建非常健壮的查询,以便以多种不同方式查看数据。

答案 1 :(得分:0)

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

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

      friends = (user, friend)

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

    USER
    ID   NAME  ...
    29   Sam
    30   Henry
    32   Jane


    Friends
    user     friend
    29       30
    29       32
山姆是简和亨利的朋友,但简和亨利不是朋友。

答案 2 :(得分:0)

我会用两个cols“user”和“friend”创建一个表“友谊”,然后你开始添加一对用户/朋友ID

答案 3 :(得分:0)

用户表 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}

答案 4 :(得分:0)

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

通常,不建议使用逗号分隔列表,因为当列表非常大时,它们会变得很痛苦。一种更简单的方法是,使用列friendsuser_id制作表friend_id,其中user_id和friend_id是相应的UserID。

现在,当您想将朋友添加到某人的列表中时,请使用以下内容:

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

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

user_id friend_id

UserA UserB UserB 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之间的关系被删除,并且它们都不是彼此的朋友。