首先查询:
$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();
正如您所看到的,我在两个查询中都选择了几乎相同的字段。问题在于条件。
是否可以在一个查询中进行此操作?
答案 0 :(得分:1)
$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还是字符串
如果您只是使用mysql_real_escape_string()
(或mysqli_real....()
适用于哪个并且记得总是引用您的$ vars,那么您可以在任何地方使用相同的转义。
它使您的代码更清晰。
可读性问题
我不知道所有的反击是什么
对我而言,你似乎吐了所有的疑问
如果标识符是保留字_(或包含空格等),则只需要反引号。
语法错误
不仅如此,还使用了未定义的别名,这是一种语法错误。
隐式联接是一种反模式
您使用隐式SQL连接,这是一种糟糕的形式,容易出错和容易混淆
使用显式连接,它将帮助您避免意外交叉连接并清除where子句以提高可读性。
如果它像鸭子一样嘎嘎叫......
如果查询(几乎)同样的事情,最好使其看起来相同。
您说查询A选择论坛中的第一个帖子,查询B选择最后一个帖子
这些结果非常类似,但查询布局却截然不同
这有点像代码味道,应该避免。
答案 1 :(得分:0)