合并两个SELECT查询

时间:2011-10-14 14:44:48

标签: mysql merge

首先查询:

$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();

正如您所看到的,我在两个查询中都选择了几乎相同的字段。问题在于条件。

是否可以在一个查询中进行此操作?

2 个答案:

答案 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)