1

在表用户的数据库中,我有三列:

id
name
friends

在列中,朋友是与名称存储在列名称中的人成为朋友的人的姓名。列友长这样:

friendname1,friendname2,friendname3,friendname4

这些朋友中的每一个都有自己的行,其中名称等于他们的名字。

我还有另一个名为 post 的表,其中有四列:

id
name_posted
post
visible

我现在想要的是从表 post 中选择所有帖子,其中 name_posted 等于登录用户的名称或他的任何朋友的名称,这些帖子存储在表用户的列朋友中。

登录用户的名称存储在变量 $user 中。

为了只选择登录用户的帖子,我可以使用这个:

$all_posts = mysqli_query($connect_db, "SELECT * FROM post WHERE name_posted='$user' AND visible='yes'");

但我不知道如何包括从他的朋友那里选择帖子。像 Facebook 这样的东西,当你登录并看到你的帖子和你朋友的帖子时。我不知道他们是如何创造的。抱歉发了这么长的帖子,我只是想给你详细的描述。

4

5 回答 5

2

对于基于跨多个表的信息选择数据,我建议阅读MySQL Joins

于 2013-04-26T16:35:12.400 回答
1

也许有两个查询,首先选择朋友是这样的:

SELECT * FROM user WHERE name='$user' 

如果我理解正确的话,你就会把他所有的朋友都放在这样的字符串中:

friend1,friend2,friend3...

爆炸 $row['friends'] -> explode(',',$row['friends']); 获取数组中的所有朋友姓名,然后您可以在 foreach 循环中进行另一个选择以获取朋友的所有帖子并以您喜欢的方式显示它,或者您甚至可以更好地 查询中执行

select * from posts where name_posted IN ($row['friends'])

这是另一种方式,会更长

foreach($friendarray as $k=>$friend){
    ...
      mysqli_query($connect_db,
          "SELECT * from post where name_posted='$friend' AND visible='yes'");
    ...
}

以及您已经拥有自己的帖子的查询。不要忘记逃避所有的价值观和东西......

您也可以加入两个表,但我无法从脑海中写出该查询,必须坐下来用真实数据进行尝试,但这将是您的最终解决方案。

不知道我是否打对了,但如果你需要帮助,请大喊

于 2013-04-26T16:45:24.060 回答
0

让我谈谈如果我需要,我将如何解决这个案子。我将使用以下表格

  1. 用户 -user_id, name, email以及我需要的任何东西
  2. 关系--relation_id, user_id, fiend_id该表将一个用户与另一个用户相关联
  3. 帖子 -post_id, user_id, content, visible

现在基本上我们拥有了所需的一切。为了从当前登录的用户和他的所有朋友中选择所有数据,我将使用以下查询:

SELECT * FROM posts
WHERE Visible = 1
    AND (
         user_id IN (SELECT friend_id FROM relations WHERE user_id = 1)
           OR  
         user_id = 1)

我在这里做什么,我使用嵌套查询来完成它。这里有趣的部分是嵌套查询——它基本上返回带有我朋友 ID 的“数组”。MySQL IN function check the user_id against that "array"在那之后,我在主括号中添加OR user_id = 1了我的 user_id。

这样,我应该拥有我想要用于我的提要的内容。然而,这段代码我远离快速和优化,但它是如何做到这一点的好例子。

于 2013-04-26T17:16:17.370 回答
0

您可能应该重新考虑数据库的设计。根据您的描述,您应该有三个表:userinfo、friendship、posts。

这样,您就可以在所有三个表之间进行快速联合,以便在一个查询中获得您要查找的内容。

于 2013-04-26T19:07:51.553 回答
0

您可以在单个查询中执行此操作,例如:

SELECT p.* 
FROM user u 
join post p 
  on (u.name = p.name or concat(',',u.friends,',') like concat('%,',p.name,',%') 
     AND p.visible='yes' 
WHERE u.name='$user' 

- 但是性能可能会比你对用户和他们的朋友之间的关系进行适当的规范化设计要差得多。

于 2013-04-26T17:39:10.293 回答