如何从数据库中选择所有帖子?

时间:2013-04-26 16:27:37

标签: php mysql

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

id
name
friends

在列中,朋友是与姓名存储在列名中的人成为朋友的人的姓名。专栏朋友看起来像这样:

friendname1,friendname2,friendname3,friendname4

每个朋友都拥有自己的行,其名称与他们的名字相同。

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

id
name_posted
post
visible

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

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

如果只选择登录用户的帖子,我可以使用:

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

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

5 个答案:

答案 0 :(得分:2)

为了根据多个表格中的信息选择数据,我建议您阅读MySQL Joins

答案 1 :(得分:1)

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

SELECT * FROM user WHERE name='$user' 

如果我理解正确的话,那么你的所有朋友都会像这样:

friend1,friend2,friend3...

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

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'");
    ...
}

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

你也可以加入两个表,但是我无法从脑海中写出这个问题,不得不坐下来尝试使用真实的数据,但这对你来说是最终的解决方案。

如果你需要帮助,不知道我是否正确,但是大声喊叫

答案 2 :(得分:0)

让我谈谈如果需要我将如何解决这个问题。 我将使用下表

  1. 用户 - user_id, name, email以及我需要的任何内容
  2. relations - relation_id, user_id, fiend_id - 此表将一个用户与其他
  3. 相关联
  4. 帖子 - post_id, user_id, content, visible
  5. 现在基本上我们拥有所需的一切。 为了从当前登录的用户和他的所有朋友中选择所有数据,我将使用以下查询:

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

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

    通过这种方式,我应该将我想要使用的内容添加到我的Feed中。 然而,这段代码我远离快速和优化,但它是如何做到这一点的好例子。

答案 3 :(得分: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' 

- 但是如果您对用户和他们的朋友之间的关系进行了正确的规范化设计,那么性能可能会更差。

答案 4 :(得分:0)

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

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