繁体   English   中英

一个函数的一个查询中的多个 SELECT 语句 | PHP --- SQL

[英]Multiple SELECT statements in one query of a function | PHP --- SQL

我需要在查询中同时在一个函数中执行 2 个选择,因为如果我把它分开,一个会被执行,而另一个则不会。

这是我的功能:

function selectOne($table, $conditions)
{
   
    global $conn;
    $sql = "SELECT * FROM $table ";
        $i = 0;
                foreach ($conditions as $key => $value) {
                    
            if ($i === 0){
                $sql = $sql . " WHERE $key=?";
                
            } else {
               $sql = $sql . " AND $key=?"; 
            }
            $i++;
        }
    
        $sql = $sql . " LIMIT 1";
    
 
            if($table == "posts"){
    $sql = "SELECT t1.*, t2.name as tipo FROM posts AS t1 LEFT JOIN tipo as t2 ON (t1.tipo_id = t2.id) WHERE t1.id = ?";
            
     $sql = "SELECT t1.*, t2.status as status FROM posts AS t1 LEFT JOIN estado as t2 ON (t1.estado_id = t2.id) WHERE t1.id = ?";
            }  
                
    

        
        $stmt = executeQuery($sql, $conditions);
        $records = $stmt->get_result()->fetch_assoc();
        return $records;
    
    }

为了更好地解释自己,我需要在这个函数中执行这 2 个选择,但只有一个有效。

$sql = "SELECT t1.*, t2.name as tipo FROM posts AS t1 LEFT JOIN tipo as t2 ON (t1.tipo_id = t2.id) WHERE t1.id = ?";
        
 $sql = "SELECT t1.*, t2.status as status FROM posts AS t1 LEFT JOIN estado as t2 ON (t1.estado_id = t2.id) WHERE t1.id = ?";  

产品图片

正如你所看到的第一个查询$sql = "SELECT t1.*, t2.name as tipo FROM posts AS t1 LEFT JOIN tipo as t2 ON (t1.tipo_id = t2.id) WHERE t1.id = ?"; " 不工作(这向我展示了它是什么类型:“正常,加号”)。

但是第二个$sql = SELECT t1.*, t2.status as status FROM posts AS t1 LEFT JOIN estado as t2 ON (t1.estado_id = t2.id) WHERE t1.id = ?"; " 如果它正在工作。 这向我显示了它的状态:“有货,缺货”


现在例如我删除第二个查询,这个: $sql = "SELECT t1.*, t2.status as status FROM posts AS t1 LEFT JOIN estado as t2 ON (t1.estado_id = t2.id) WHERE t1.id = ?"; 这是工作。 但是我当然不能让另一个出现。

产品图片 - 二


新问题编辑

数据库 - 表格和行:

ESTADO.SQL状态 IMG

TIPO.SQL TIPO IMG

POSTS.SQL POST IMG

帖子表包含 2 列,表示内容的 ID,在这种情况下,在 estado_id (1) 和 tipo_id (1) 中选择了“Ice Cream”

我需要我的查询通过 JOINS 链接 3 个表“estado.sql”、“tipo.sql”、“post.sql”,并能够显示产品中其他表的数据。

例子:

冰淇淋 | estado_id (1 = 可用) | tipo_id (1 = PLUS)

首先要注意,仅执行最后一个查询的原因是您覆盖了$sql变量。 无论如何,您都必须执行两次提取,因此我们现在可以专注于使其成为单个查询(您可以有多个连接):

SELECT p.name, t.name, e.status
FROM posts p
    LEFT JOIN tipo t ON t.id = p.tipo_id
    LEFT JOIN estado e ON e.id = p.estado_id
WHERE p.id = ?

请参阅fiddle进行测试。

这样,一个查询将返回您需要的所有内容,而不必运行其中的两个。 如果您需要更多数据,只需根据您的要求修改您的SELECT子句(例如,如果您需要有关帖子的更多详细信息,我只限于名称)。

额外的建议:当你给你的表一个别名时,避免像t1t2等这样的东西。在一个简短的查询中是可以的,但是当你最终得到连接 5-6 个或更多表的更大的查询时,很容易忘记哪个表是t2 ,哪个是t5 试着给他们一个代表他们名字的速记——在我的例子中,我使用了首字母,因为所有的表格都以不同的字母开头。 一般来说,如果表名很短,你可以完全省略别名分配,只使用表名:

SELECT posts.name, tipo.name, estado.status
FROM posts
    LEFT JOIN tipo ON tipo.id = posts.tipo_id
    LEFT JOIN estado ON estado.id = posts.estado_id
WHERE posts.id = ?

这也是一样的。

一般规则是使您的代码可读和明确(您必须做的破译越少——例如哪个表是t3越好)。 即使您认为“哦,我不必在这个项目中加入那么多表”,也许将来您会这样做。 而且好习惯是早养成的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM