【问题标题】:Php optimize my request with joins ?Php 使用连接优化我的请求?
【发布时间】:2012-10-18 18:31:16
【问题描述】:

我带着一个关于 mysql 查询的问题来到这里。 我会尽量让它简单快捷(并且可以理解,因为我说法语) 这是我在 StackOverFlow 上的第一篇文章,它已经帮助我解决了各种问题,因此感谢所有社区 :)

我对 php 和 mysql 很陌生,我正在编写一个使用 php 和 mysql 的 iOS 应用程序。 在此示例中,我使用了 2 个不同的表:

-Utilisateurs(法语用户),包含:

  • 姓名
  • image_name(引用服务器上的 profileImage)
  • 以及我在此示例中未使用的其他字段

-关注者,包含:

  • user_name(静默)
  • follows(此字段包含 user_name 关注的用户的名称

这是完美运行的查询

    if (!$con)
    {
    die('Could not connect: ' . mysql_error());
    }

    mysql_select_db(db, $con);


    // By this request I select the users that my current user ($_GET['userName']) follows

    $result = mysql_query('SELECT user_name, follows FROM Followers WHERE user_name = "'.$_GET['userName'].'"');
    while($row = mysql_fetch_array($result)){



    //When I find a user that my current user follows, I select his name and the name of the user(s) that user has followed less than 2 days ago

     $user = $row['follows'];
     $res = mysql_query('SELECT user_name, follows, followed_on FROM Followers WHERE user_name = "'.$user.'" AND TO_DAYS(NOW()) - TO_DAYS(followed_on) <= 2');



    // Now when I find a user that is followed by the user that my current user follows, I select the profile image linked to his profile

     while($follow = mysql_fetch_array($res)){
     $img = mysql_query('SELECT image_name FROM Utilisateurs WHERE name = "'.$follow['follows'].'"');
     if(mysql_num_rows($img) != 0){



//And here I echo differents results if a profileImage has been found or not

        $imgProfile = mysql_fetch_row($img);
        echo $follow['user_name'].'$'.$follow['follows'].'$'.$imgProfile[0].'#';
    }else{
        echo $follow['user_name'].'$'.$follow['follows'].'$ #';
    }
 }
}

当我使用“benben”(我的当前用户)作为 $_GET['username'] 的用户名执行此查询时,一切正常,这是我在 Web 浏览器中得到的结果

Simon$Seba$#Simon$Seb$#Simon$benben$307233348488807.jpg#

在这里我可以看到:

  • Simon 跟着 Seba
  • Simon 已关注 Seb
  • Simon 关注了本本(我),其 image_name 为 307233348488807.jpg

我将所有这些都放在我的 iOS 应用程序中的数组中,一切都正常显示并且工作正常。

但是,如果我关注了很多用户,而这些用户也关注了许多其他用户,那么就会有很多查询。 更糟糕的是,如果许多用户同时这样做。

所以我想我应该执行一些 JOINS 以执行更少的查询,但由于我是 php 和 mysql 的新手,我不知道该怎么做。我已经在比这个更简单的查询中执行了一些 JOINS,但是这个让我感到困惑。

因此,如果有人对我有一些建议或可以帮助我使用 JOINS 执行此请求,将不胜感激 :)

【问题讨论】:

  • 你能在sqlfiddle.com上发布你的表结构和一些示例数据吗?

标签: php mysql ios


【解决方案1】:

我想说告诉我更多关于你想要实现的目标,因为这可能需要比简单的连接修复更底层的优化,在 2 天内回显跟踪链背后的逻辑是什么?此外,如果这将是一个重负载应用程序,最好使用 hadoop 或其他一些面向对象的数据库,而不是更容易扩展的 mysql。告诉我

【讨论】:

  • 嘿,我需要做的是: - 我在数据库中注册了用户 - 用户可以用他的密码连接并登录 - 用户可以发布其他用户可以看到的东西(那里是一个新闻提要,显示用户的最后活动,并显示您可以关注的用户的最后活动(2 天前)(通过单击用户个人资料上的简单“关注”按钮) - 所以我想优化查询该新闻提要正在使用(通过上面的代码)-然后通过在我的应用程序中回显查询的所有结果来显示它们。(我不是要创建一个新的 Facebook 哈哈)
  • 好的,但是您正在尝试将活动记录为单个表条目中的多个事件的字符串,这基本上没有利用数据库的功能,您需要创建一个“活动”表和使用用户 ID、事件时间和目标用户 ID 输入每个活动,然后根据正在查看的用户开始在您的配置文件控制器中回显用户的活动。如果你问我为什么要这样做,我自己设计并编写了一个社交网络,这就是我自己处理新闻提要打印的方法。
  • 在解析您使用自定义标识符(如美元和井号)创建的字符串时,如果您曾经使用正则表达式解析它们,您可能会遇到问题,因为它们是保留字符。例如 $ 符号表示行尾等...
  • 嘿,抱歉回复晚了,我整个周末都很忙。好的,我已经考虑过在我的数据库中创建一个表活动,但没有这样做,因为它工作得很好,但我会听从你的建议。它似乎更有条理。在您对我的数据库中的数据解析发表评论之后,我想有更好的方法可以做到这一点,是的,我用我的低 PHP 级别做了我所能做的。你推荐我用 JSON 解析来获取我的数据吗?所以我不必在 echo 中用特殊字符分隔我的所有列值?再次感谢!
  • 我建议你根本不要使用解析。只是首先规范化你的数据,想想什么是数据库列条目,什么是单独的表,因为如果你考虑一下,如果你在一个数据库条目中解析某个数据,这意味着你还没有足够规范化它,那它可以进一步传播到不同的条目表。
猜你喜欢
  • 2013-10-02
  • 1970-01-01
  • 2015-11-22
  • 2011-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-02
  • 2021-09-05
相关资源
最近更新 更多