Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用PHP和MySQL获取信息的最佳算法是什么_Php_Mysql - Fatal编程技术网

使用PHP和MySQL获取信息的最佳算法是什么

使用PHP和MySQL获取信息的最佳算法是什么,php,mysql,Php,Mysql,我试图在这里找到一个更好的算法。在我的问题中,一个用户的列表中有200个朋友。我的数据库如下所示: username friends someid 2,3,4,6,7 我所做的就是增加一个新朋友。个人唯一id被添加到他的列表中,因此这里2,3,4,6,7是用户朋友的id 普通用户信息数据库是这样的 friends info id profile image name info

我试图在这里找到一个更好的算法。在我的问题中,一个用户的列表中有200个朋友。我的数据库如下所示:

    username          friends
     someid           2,3,4,6,7
我所做的就是增加一个新朋友。个人唯一id被添加到他的列表中,因此这里2,3,4,6,7是用户朋友的id

普通用户信息数据库是这样的

   friends info 
    id     profile image    name               info
    2         his image    his name       presently
我的算法是获取id 2并从表中提取所有数据,将id=2放入表中,然后类似地取3、4、6和更多,但如果用户有200个朋友,我认为这可能会在服务器上造成严重问题,因为它会使服务器忙,因为它应该为2提取数据,为3提取数据

所以我考虑了一个更好的算法,因为如果用户有更多的朋友,服务器必须执行MySQL select*语句200次,如果他们有200个朋友,这可能会导致严重的服务器问题

我想知道是否有一个简单的算法可以做,或者我是否应该改变数据在数据库中的保存方式

有时,我认为应该将所有数据提取并存储在php变量中,然后将其保存到JavaScript变量中,然后使用JavaScript执行操作,因为JavaScript是客户端,可以消除服务器问题

使现代化 桌子的大小是有限的吗?我的意思是一张桌子能由无限行组成吗

friends_table
  user id       friend id
    2                3
    2                4
users_info table
  user id           image           small info
     3            some image             // 
     4              //                   //
     2                 //                //
正如人们建议的那样,我会改变结构,但我如何将friends表链接到users信息表

   $result = mysql(select * from friends_table where id = userdid);
   $row = mysql_fetch_array($result);
上面的查询获取朋友的所有ID

现在我必须使用他们的id获取朋友信息,所以我必须执行此语句

   for($i=0 ;$i<count($row);$i++)
   mysql(select * from users_info where id=$row[$i])

我想我应该多次重复这句话。换句话说,我必须循环这个语句吗?

我不建议将所有信息发送给客户端,以便它自己弄清楚,因为访问者将能够看到所有数据-这不是很安全。在这种情况下,他们可以看到每个人的朋友

而不是把所有朋友的ID都保存在一个varchar里我想你现在正在做什么?您应该创建一个新的“Friends”表,其中包含两列:用户ID和他们朋友的ID。这意味着,根据关系,该表中会有一个新记录。这将是一种更快的存储方式,而且是一种更整洁的读取方式


搜索这些表不会花费很长时间。特别是对于只有200个用户,这一点都不成问题。我怀疑您当前的设置也会有问题。

不是将所有朋友的ID存储在一列中,而是创建一个与表的关系,将用户映射到他们的朋友

user_friends table:

| user_id  | friend_id |
|==========|===========|
|  someid  |     2     |
|  someid  |     3     |
|  someid  |     4     |
|  someid  |     6     |
|  someid  |     7     |
然后您可以在一个查询中选择所有好友信息

SELECT `friends_info` * from `friends_info` 
LEFT JOIN user_friends ON user_friends.friend_id = friends_info.id
WHERE user_friends.user_id = someid
您可以这样使用查询:

$result = mysql_query("<the query goes here>"); // Execute the query

while ($row = mysql_fetch_array($result, MYSQL_NUM)) { // For each row..
   (...)    // ...do sth with the data
}

mysql_free_result($result);
当前:

建议:


获取单个SQL查询中的所有好友详细信息

不要使用逗号分隔的好友列表:将表添加为好友


等等。让数据库为您完成工作。

您可以在基本条件下使用fething
在[2,4,5,8]中选择*from user where userid

最好的算法是更改您的数据库结构,并为每个用户/friendid使用一行,而不是逗号分隔的列表-您所做的总是导致problems@MarkBaker非常感谢您的帮助,但是您能帮我解释一下数据库的结构吗?使用我的答案中的查询来避免循环。它一次获取给定用户id的所有相关行。我添加了PHP代码来处理它。使用联接比从两个表中进行选择具有更好的性能,尤其是当表很大时。也许,尽管我使用的是简单的内部联接。性能必须经过测试。。。但我更关心的是证明一个标准化的表格比一个逗号分隔的朋友列表要好
$result = mysql_query("<the query goes here>"); // Execute the query

while ($row = mysql_fetch_array($result, MYSQL_NUM)) { // For each row..
   (...)    // ...do sth with the data
}

mysql_free_result($result);
username    friends 
someid      2,3,4,6,7
username    friendid
someid      2
someid      3
someid      4
someid      6
someid      7

select users.*
  from users,
       friends
 where users.id = friends.friendid
   and friends.username = someid
    id        friend_id
    9          2
    9          4
    9          7
    9          5
    2          3
    2          7