【问题标题】:Execute an SQL query inside another SQL query在另一个 SQL 查询中执行一个 SQL 查询
【发布时间】:2017-08-21 02:57:34
【问题描述】:

好吧,我假设标题不是最好的标题,但让我解释一下我的问题:我正在创建一个需要显示人们帖子的网站(无论如何),我必须显示他们的头像的头像,所以这就是我所做的:

<?php 
            function get_gravatar( $email, $s = 80, $d = 'mm', $r = 'g', $img = false, $atts = array() ) {
                $url = 'https://www.gravatar.com/avatar/';
                $url .= md5( strtolower( trim( $email ) ) );
                $url .= "?s=$s&d=$d&r=$r";
                if ( $img ) {
                    $url = '<img src="' . $url . '"';
                    foreach ( $atts as $key => $val )
                        $url .= ' ' . $key . '="' . $val . '"';
                    $url .= ' />';
                }
                return $url;
            }
            require("db.php");
            $sql = "SELECT * FROM posts ORDER BY date DESC";
            foreach ($db->query($sql) as $row) {
                // var_dump($row);
                $user = $row['user_id'];
                $sql_user = "SELECT email FROM users WHERE id = $user";
                foreach ($db->$sql_user as $row_user) {
                    var_dump($row_user);
                    echo "<img src=\"".get_gravatar($row_user['email'])."\"/>";
                }
                echo "<h2>".$row['title']."</h2><br/>";
                echo "<p>".$row['content']."</p><br/>";
            }

但是,它不起作用(好吧,它起作用了,但它没有向我显示用户的个人资料图片,只有帖子)。 所以,我认为问题是我不能同时调用变量$db 2 次,但我不确定,所以这就是 m=为什么我要问是否有办法解决我的问题或同时选择 2 个表。

【问题讨论】:

  • 查看您错过的第二次 foreach 放置查询功能

标签: php mysql sql-server web backend


【解决方案1】:

你可以缩短你的逻辑

$sql="SELECT u.email "
                    . "FROM posts AS p "
                    . "LEFT JOIN users AS u "
                    . "ON u.id=p.user_id "
                    . "ORDER BY p.date DESC";

【讨论】:

  • 你能开发吗?我的意思是,你能解释一下我如何使用它吗?
  • 这样更好,因为您不会在内部 for 循环中运行多个查询,这会增加开销。另外我认为第一部分应该是“SELECT p.user_id,u.email”。 u 和 p 混淆了。
  • 只需调用您想要的列,在您的情况下是 $row['email'] ,这已经与用户数据相关。您也可以在单个 result set 中获得 $row['user_id']
  • @waltron aw,你的权利,:) 它的错误样本,或者我们可以删除 taht,因为只需要电子邮件
【解决方案2】:

使用join

SELECT * FROM users join posts  on users.id =Posts.user_id ORDER BY date DESC

【讨论】:

    【解决方案3】:

    您没有在第二个 foreach 中将查询应用于 sql 字符串

      foreach ($db->query($sql_user) as $row_user) {
    

    【讨论】:

    • 您的解决方案有效,但我更喜欢加入一个,谢谢:)
    • 您更喜欢一个建议的解决方案,但不是您问题的解决方案..? ..通常该解决方案被接受..并且该建议被标记为有用..
    【解决方案4】:

    查看您错过的第二个 foreach 以放置查询功能

    foreach ($db->query($sql) as $row) {
    
    
    
    foreach ($db->query($sql_user) as $row_user) {
    

    【讨论】:

    • 您的解决方案有效,但我更喜欢加入一个,谢谢 :)
    【解决方案5】:

    你可以使用JOIN

    JOIN 子句用于组合两个或多个表中的行,基于 它们之间的相关列。

    【讨论】:

    • join 和 Union 有很大的不同
    • @Jens 是的,它们是不同的...... UNION 用于将多个 SELECT 语句的结果组合成一个结果集。而 JOIN 子句用于组合两个或多个表中的行,基于它们之间的相关列......他可以使用其中任何一个来实现他的结果......他想同时选择 2 个表..
    • 不,他不能。您无法解决功能非常不同的问题
    • 我建议使用其中任何一个
    • 是的,但是如果 OP 使用 Union,他永远不会得到他/她想要的结果
    最近更新 更多