gpt4 book ai didi

mysql - 合并两个 SELECT 查询

转载 作者:行者123 更新时间:2023-11-29 00:52:32 25 4
gpt4 key购买 nike

第一个查询:

$fpost = $sql->query(" SELECT `p`.`name`, `f`.`id`, `f`.`topic`, `f`.`date`, `f`.`last` 
FROM `posters`, `forum`
WHERE `f`.`deleted` = 0
AND `f`.`neg` = ".(int) $neg['id']."
AND `p`.`id` = `f`.`author`
ORDER BY `f`.`last` DESC LIMIT 1")->fetch();

第二个查询:

$lpost = $sql->query("SELECT `p`.`name`, `f`.`id`, `f`.`topic`, `f`.`date`, `a`.`access` 
FROM `forum`, `posters`
LEFT JOIN `account` `a` ON (`a`.`id` = `p`.`aid`)
WHERE `f`.`neg` = ".(int) $neg['id']."
AND `p`.`id` = `f`.`author`
AND `f`.`date` = " . (int) $fpost['last'] . "
LIMIT 1")->fetch();

如您所见,我在两个查询中选择了几乎相同的字段。问题是条件。

是否有可能在一次查询中完成?

最佳答案

$neg_id = mysql_real_escape_string($neg['id']);

$query =" (SELECT p.name, f.id, f.topic, f.date, f.last, null as access
FROM forum f
INNER JOIN posters p ON (p.id = f.author) <<-- use explicit join syntax
WHERE f.deleted = 0
AND f.neg = '$neg_id'
ORDER BY f.date ASC <<-- first post
LIMIT 1 OFFSET 0)
UNION
(SELECT p.name, f.id, f.topic, f.date, f.last, a.access
FROM forum f
INNER JOIN posters p ON (p.id = f.author)
LEFT JOIN account a ON (a.id = p.aid)
WHERE f.deleted = 0
AND f.neg = '$neg_id'
ORDER BY f.date DESC <<-- last post
LIMIT 1 OFFSET 0) ";

对您的代码的评论

转义
我建议只使用一种转义函数。
它简化了您的代码,无需担心列是 int 还是 string。
如果您只是使用 mysql_real_escape_string() (或 mysqli_real....() 以适用者为准) 并记住始终引用您的 $vars,那么你可以在任何地方使用相同的转义。
它使您的代码更加简洁。

可读性问题
我不知道所有反引号是怎么回事。
在我看来,您似乎吐出了所有问题。
如果标识符是保留字 _(或包含空格等),则只需要反引号。

语法错误
不仅如此,你还使用了未定义的别名,这是一个语法错误。

隐式连接是一种反模式
您使用隐式 SQL 连接,这是错误的形式,容易出错且令人困惑。
改用显式连接,它将帮助您避免意外的交叉连接并清除您的 where 子句,提高可读性。

如果它像鸭子一样嘎嘎叫....
如果查询(几乎)做同样的事情,最好让它看起来一样。
你说查询 A 选择论坛中的第一篇帖子,而查询 B 选择最后一篇。
这些结果非常相似,但查询布局却大不相同。
这有点像代码味道,应该避免。

关于mysql - 合并两个 SELECT 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7769344/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com