2012-03-27 2 views
0

id, posstatus 열이있는 mysql 테이블이 있어야합니다.
그리고 pos 정확한 값 id 값을 가장 가까운 작은 pos 값으로 바꿔야합니다. 하지만 status = 1 행만 계산해야합니다. 그것은 다음과 같이 작동합니다 즉
:1 개의 mysql 쿼리를 만들려면

$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 개 쿼리를 가지고 최선의 해결책이 아니다 생각합니다. 모든 쿼리를 적은 쿼리로 처리하는 방법이 있습니까? 감사! 사용하십시오 저장 프로 시저[1][2] 또는 transaction로 한 번에 여러 쿼리를 보낼 :

+0

그것은 간단합니다, 왜 일을 복잡하게합니까? –

답변

1

은 당신이 할 수있는 두 가지가 있습니다. 그것은 어느 쪽을 원하는대로 유지할 것인가에 달려 있습니다.

또한 이전의 mysql_* 기능을 MySQL 데이터베이스에 액세스하는 방법으로 삭제하는 것이 좋습니다. 그들은 더 이상 10 세이며 더 이상 유지 관리되지 않으며 커뮤니티는 process of deprecation을 시작했습니다. 2012 년에 mysql_*이라는 새 코드를 작성하면 안됩니다. 대신 DB에 액세스하기위한 API로 PDO 또는 MySQLi을 사용하는 방법을 배워야합니다. 나는이 시도하지 않은하지만 작동합니다

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

저장 프로시 저는 여러 개의 쿼리를 함께 실행하는 최상의 선택입니다.

관련 문제