2012-03-27 32 views
0

我有mysql表,列id,posstatus
而且我需要將pos的值精確變換爲id,並將其與最接近的較小值pos對應。但我只需要計算與status = 1行。
換句話說,它應該像這樣工作:進行5 mysql查詢到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"); 
} 

它工作得很好這樣的,但我認爲這不是最好的解決辦法有,因爲一個簡單的事情,5個查詢。有沒有辦法如何將這一切放到更少的查詢中?謝謝!

+0

它工作,很簡單,爲什麼複雜的東西? – 2012-03-27 21:42:44

回答

1

有兩兩件事可以做:用存儲過程[1][2]或一次發送多個查詢與transaction。它有點取決於你想保留哪一方。

此外,我強烈建議您刪除舊的mysql_*函數作爲訪問MySQL數據庫的一種方式。他們超過10歲,不再維護,社區已開始process of deprecation。您不應在2012年使用mysql_*編寫新代碼。您應該學習如何使用PDOMySQLi作爲訪問數據庫的API。

這裏有兩個教程,你可能看:

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 
0

存儲過程是一起執行多個查詢的最佳選擇。