2013-04-26 67 views
1

在表的用户数据库中,我有三列:如何从数据库中选择所有帖子?

id 
name 
friends 

在列的朋友是人谁是朋友与人的姓名存储在列名的名字。列的朋友是这样的:

friendname1,friendname2,friendname3,friendname4 

每个那些朋友有它自己的行其中name等于他们的名字。

我也有所谓的后另一个表,我有四列:

id 
name_posted 
post 
visible 

我现在想什么,是选择从那里name_posted表后的所有帖子等于登录的用户或名称他的任何朋友都存储在表格用户的列朋友中。

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

用于从登录的用户,我可以使用这个唯一的帖子:

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

,但我不知道该怎么也包括选择从他的朋友的帖子。像Facebook这样的东西,当你登录,你看到你的帖子加上你的朋友帖子。我不知道他们是如何创造的。对不起,很长的文章,我只是想给你详细的描述。

+0

你能修改你的数据库设计吗?表'user'中的列“friends”目前违反了第一范式,这使得编写使用它的查询变得困难。 – 2013-04-26 16:48:19

回答

1

,第一选择的朋友是这样的:

SELECT * FROM user WHERE name='$user' 

然后,您有他在字符串中的所有这样的朋友,如果我理解正确:

friend1,friend2,friend3... 

爆炸$行[”朋友 '] - >爆炸(', '$行[' 朋友]);获得在阵列中的所有朋友的名字,然后你可以做的另一种选择在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'"); 
    ... 
} 

并且还查询您已经必须获得自己的帖子。不要忘了逃跑的所有值和东西...

你也可以加入两个表,但我不能写从我的脑海该查询,就不得不坐下来,用实际数据尝试,但,这将是最终的解决办法为你。

不知道如果我打正确的,但喊,如果你需要帮助

+0

这应该工作,只剩下一个问题。如果一个朋友的名字是例如Mark,并且有其他名字为Domark或Markes的用户,它也会显示他们的帖子,虽然他们不是登录用户的朋友。我不知道是否有更好的方式来建立友谊。 – 2013-04-26 20:10:26

+0

你可以使用朋友ID来连接朋友而不是姓名。这将解决重复的名称问题。 – vodich 2013-04-27 21:01:37

2

对于基于跨多个表,我建议在MySQL Joins阅读了信息选择的数据。也许有两个querys

+1

一个有效的评论,但不是OP的问题的答案。 – 2013-04-26 16:39:20

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。

以这种方式我应该有我想用于我的饲料的内容。然而,这个代码我远离了快速和优化,但它是一个很好的例子,如何做到这一点。

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' 

- 但性能可能会比如果你有用户和他们的朋友之间的关系的正确标准化设计穷得多。

+0

我知道我的数据库设计不是最好的。你能建议我如何重新设计它吗? – 2013-04-26 19:51:35

0

您应该重新考虑您的数据库的设计。从你所描述的,你应该有三个表:用户信息,友谊,帖子。

通过这种方式,您可以在所有三个表格之间快速合并,以便在一个查询中获得您要查找的内容。

+0

友谊表应该怎么样? – 2013-04-26 20:03:53

+0

理想情况下,您将在一张桌子上拥有基本的用户信息,并创建具有关系节点的第二个表。每个关系在该表上都有两个条目。通过加入自己,你可以获得任何给定人的所有友谊。 – rami 2013-05-14 00:07:24

相关问题