به روز کردن چند سطر از دیتابیس با مقادیر متفاوت در یک کوئری

شروع موضوع توسط Mohammadreza ‏12 فوریه 2011 در انجمن برنامه‌نویسی با PHP

کلمات کلیدی:
  1. Mohammadreza

    Mohammadreza Well-Known Member

    ارسال‌ها:
    1,206
    تشکر شده:
    634
    امتیاز دستاورد:
    113
    برای مثال شما می خواهید در یک جدول سطری که ID اون برابر با 150 هست رو تبدیل به 151 کنید و همچنین همزمان سطری که ID اون برابر 160 هست رو برابر 161 کنید...

    استفاده از دو کوئری :
    در اینجا اولین فکری که به ذهن میرسه استفاده از دو کوئری به جای یک کوئری هست که تقریبا تصمیم عاقلانه ای هم هست...

    ایراد :
    اما اگر تصمیم داشته باشید ID که 150 هست رو به 151 و ID که 151 هست رو به 150 تبدیل کنید با دو کوئری به مشکل بر می خورید...

    چرا ؟

    به دلیل اینکه در کوئری اول 150 به 151 تبدیل می شه و حالا دو سطر با ID که 151 هست داریم و حالا نوبت کوئری دوم هست که 151 رو تبدیل به 150 کنه

    چه اتفاقی می افته ؟... هر دو سطر تبدیل به 150 میشه

    و اینجا ما به خواستمون نمی رسیم ... (تبدیل 150 به 151 و تبدیل 151 به 150 همزمان )

    اگه فیلد ID به صورت PRIMARY KEY باشه که دیگه در همون کوئری اول به مشکل بر می خوریم ، زیرا داده تکراری نمی پذیرد ... و هیچکدام از کوئری اول و دوم اجرا نمی شود

    راه حل :

    کد (Text):

    UPDATE `TABLE`
    SET id = CASE id
    WHEN 151 THEN 150
    WHEN 150 THEN 151
    END
    WHERE id IN (151,150);
     
    کاربرد :
    یکی از نمونه های پرکاربرد این مسئله در طراحی ترتیب برای قرار گیری منو یا مطالب در سایت هست ...
     
    آخرین ویرایش: ‏12 فوریه 2011
    نوشته شده توسط Mohammadreza در ‏12 فوریه 2011
    Masoud1365، maysam.m، greencat و 3 نفر دیگر از این ارسال تشکر کرده اند.
  2. greencat

    greencat Member

    ارسال‌ها:
    114
    تشکر شده:
    44
    امتیاز دستاورد:
    16
    سلام
    با کوئری زیر هم فکنم بشه این کار رو انجام دادش نه :
    کد (Text):
    query = "update table set id = (id+1) where (id>149) and (id<152)"
    راستی این نوع کوئری که نوشتید اسم خاصی هم داری؟ منظورم استفاده از then و end در کوئری ها؟
    ممنون از مطلبتون.
     
    نوشته شده توسط greencat در ‏12 فوریه 2011
  3. Mohammadreza

    Mohammadreza Well-Known Member

    ارسال‌ها:
    1,206
    تشکر شده:
    634
    امتیاز دستاورد:
    113
    نه اون کوئری شما این کار رو نمی کنه
    ---
    توی خود سایت MYSQL اشاره شده به CASE Statement
    که برای گرفتن کوئری های شرطی پیچیده استفاده میشه
    http://dev.mysql.com/doc/refman/5.0/en/case-statement.html
    من یه نوع کاربردش رو در بالا ارائه دادم
     
    نوشته شده توسط Mohammadreza در ‏12 فوریه 2011
    greencat از این پست تشکر کرده است.

به اشتراک بگذارید