[英]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
子句(例如,如果您需要有关帖子的更多详细信息,我只限于名称)。
额外的建议:当你给你的表一个别名时,避免像t1
、 t2
等这样的东西。在一个简短的查询中是可以的,但是当你最终得到连接 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.