2012-03-27 2 views
0

Ich habe mysql Tabelle mit Spalten id, pos und status.
Und ich muss pos Wert von genau id mit dem nächsten kleineren pos Wert austauschen. Aber ich muss nur Zeilen mit status = 1 zählen.
Mit anderen Worten sollte es so funktionieren:Machen 5 MySQL Abfragen in 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"); 
} 

Es funktioniert wie folgt ganz gut, aber ich denke, es ist nicht die beste Lösung, die 5-Abfragen zu haben, weil eine einfache Sache. Gibt es eine Möglichkeit, alles in weniger Fragen zu setzen? Vielen Dank!

+0

Es funktioniert, es ist einfach, warum Dinge komplizieren? –

Antwort

1

Es gibt zwei, was Sie tun können: Verwenden Sie ein Stored Procedure[1][2] oder mehrere Abfragen auf einmal mit transaction senden. Es hängt davon ab, auf welcher Seite Sie alles behalten wollen.

Auch würde ich dringend empfehlen für Sie, die alten mysql_* Funktionen als eine Möglichkeit zum Zugriff auf MySQL-Datenbank zu löschen. Sie sind mehr als 10 Jahre alt, nicht mehr gepflegt und die Gemeinde hat die process of deprecation begonnen. Sie sollten 2012 keinen neuen Code mit der Nummer mysql_* schreiben. Stattdessen sollten Sie lernen, wie man PDO oder MySQLi als API für den Zugriff auf die DB verwendet.

Hier sind zwei Tutorials Sie aussehen könnte:

0

Ich habe nicht versucht, aber es sollte funktionieren. Es ist nicht schön!

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

Die Speicherprozedur ist die beste Wahl, um mehrere Abfragen gleichzeitig auszuführen.