将5个mysql查询转换为1

时间:2012-03-27 21:38:34

标签: php mysql optimization

我有一个包含idposstatus列的mysql表 我需要将pos精确id的值与最接近的pos值进行交换。但我只需要计算status = 1行 换句话说,它应该像这样工作:

$pos = mysql_result(mysql_query("select pos from foo where id = $id"),0);
$min = mysql_result(mysql_query("select min(pos) from foo where status = 1"),0);
if($pos != $min){
  $i = mysql_result(mysql_query("SELECT pos from foo where pos < $pos ORDER by pos DESC LIMIT 1"),0);
  mysql_query("update tbc_sidebar set pos = $i where id = $id");
  mysql_query("update tbc_sidebar set pos = pos + 1 where id <> $id AND pos = $i");
}

这样工作得很好,但我认为由于一件简单的事情,这不是最好的解决方案。有什么办法可以把它全部放入更少的查询中吗?谢谢!

3 个答案:

答案 0 :(得分:1)

您可以做两件事:使用存储过程 [1] [2] 或发送多个查询与transaction一起。这有点取决于你想要保留所有这一面。

此外,我强烈建议您删除旧的mysql_*函数作为访问MySQL数据库的方法。他们已经超过10岁,不再维持,社区已经开始process of deprecation。您不应该在2012年使用mysql_*编写新代码。相反,您应该学习如何使用PDOMySQLi作为访问数据库的API。

以下是您可能会看到的两个教程:

答案 1 :(得分:0)

我没有尝试过,但应该可以。它不漂亮!

UPDATE tbc_sidebar main
INNER JOIN (
    SELECT t1.id id1, t1.pos pos1, t2.id id2, t2.pos pos2
    FROM tbc_sidebar t1
    INNER JOIN tbc_sidebar t2
        ON t1.pos > t2.pos
        AND t2.status = 1
    WHERE t1.id = $id
    ORDER BY t2.pos DESC
    LIMIT 1
) AS tmp
    ON main.id = tmp.id1 OR main.id = tmp.id2
SET main.pos = CASE
        WHEN main.id = tmp.id1 THEN tmp.pos2
        WHEN main.id = tmp.id2 THEN tmp.pos1
    END

答案 2 :(得分:0)

存储过程是一起执行多个查询的最佳选择。