我有一个包含id
,pos
和status
列的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");
}
这样工作得很好,但我认为由于一件简单的事情,这不是最好的解决方案。有什么办法可以把它全部放入更少的查询中吗?谢谢!
答案 0 :(得分:1)
您可以做两件事:使用存储过程 [1] [2] 或发送多个查询与transaction一起。这有点取决于你想要保留所有这一面。
此外,我强烈建议您删除旧的mysql_*
函数作为访问MySQL数据库的方法。他们已经超过10岁,不再维持,社区已经开始process of deprecation。您不应该在2012年使用mysql_*
编写新代码。相反,您应该学习如何使用PDO或MySQLi作为访问数据库的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)
存储过程是一起执行多个查询的最佳选择。