سؤال

وأنا أحاول أن إنشاء استعلام SQL في PHP لتحديث الجدول. هل من الممكن أن يكون بندا WHERE مختلفة لكل صف المتضررين؟

وعلى سبيل المثال شيئا مثل:

UPDATE table 
SET val=X WHERE someproperty = 1,
SET val=Y WHERE someproperty = 2

وغيرها؟

وأي عن تقديره للمساعدة. بفضل

هل كانت مفيدة؟

المحلول

وأنت لا يمكن أن يكون العديد من عبارات WHERE لأي بيان SQL، ولكن يمكنك استخدام بيان حالة لإنجاز ما تحاول القيام به. وثمة خيار آخر أن لديك هو تنفيذ عبارات UPDATE متعددة.

وهنا هو عينة باستخدام عبارة حالة:

UPDATE table
SET val = (
    CASE someproperty
        WHEN 1 THEN X
        WHEN 2 THEN Y
        ELSE val
    END
);

وهنا هو عينة باستخدام عبارات UPDATE متعددة:

UPDATE table SET val=X WHERE someproperty = 1;
UPDATE table SET val=Y WHERE someproperty = 2;

نصائح أخرى

نعم، يمكنك مع بيان حالة.

UPDATE table
SET val = CASE someproperty  
           WHEN 1 THEN x 
           WHEN 2 THEN y
           ....
          ELSE
           val
          END

والآن، هناك قلق من أن بيان CASE واحد هو أقل قراءة بالمقارنة مع العديد من البيانات UPDATE. هناك حجة صحيحة هنا. على سبيل المثال، عندما يتم تحديث 1000 الصفوف، هو فقط يشعر ويبدو من الأفضل استخدام البيانات UPDATE عدة بدلا من 1000 ظروف مختلفة إلى CASE واحد.

ولكن، في بعض الأحيان بيان حالة هو أكثر ملاءمة. إذا، على سبيل المثال، تقوم بتحديث صفوف استنادا إلى بعض الصفات، ويقول الطبيعة الفردية أو الزوجية من قيمة الحقل في الجدول، ثم بيان CASE هو وسيلة موجزة رائعة وللصيانة لتحديث الصفوف في الجدول دون الحاجة إلى اللجوء إلى عدد هائل من البيانات UPDATE أن كل حصة نوع معين من المنطق. خذ هذا على سبيل المثال:

UPDATE table
SET val = CASE MOD(someproperty, 2)  
           WHEN 0 THEN x 
           WHEN 1 THEN y
          END

وهذا التعبير يأخذ معامل someproperty، وعند 0 (حتى)، يعين قيمة س لفال، وعندما 1 (الغريب)، يعين قيمة ص لفال. وكلما زاد حجم البيانات التي يتم تحديثها من هذا البيان، ونظافة ومقارنته بذلك تصريحات UPDATE متعددة.

وباختصار، البيانات CASE في بعض الأحيان مثلما قراءة / للصيانة كما البيانات UPDATE. كل هذا يتوقف على ما كنت تحاول أن تفعل معهم.

تعديل : في إضافة شرط آخر لتكون آمنة اضافية. قد يكون OP الذين يرغبون في تحديث صفوف معينة فقط حتى بقية يجب أن تبقى لأنها قبل UPDATE.

تعديل : لوأضاف سيناريو حيث بيان CASE هو نهج أكثر فعالية من البيانات UPDATE متعددة.

وكلا. جعله اثنين من التحديثات:

UPDATE table SET val=X WHERE someproperty = 1;
UPDATE table SET val=Y WHERE someproperty = 2;

في الفكرة الثانية، هل يمكن استخدام الاستعلامات الفرعية أو بيان حالة ...

UPDATE table SET val= ( case when someproperty = 1 then X when someproperty = 2 then Y else val END )

وقد تحتاج لجعل هذا استعلام فرعي مثل هذا:

UPDATE table t1 SET val = ( select CASE when someproperty = 1 then X when someproperty = 2 then Y ELSE val END from table t2 where t1.primarykey = t2.primary key )
UPDATE TABLE
SET VAL CASE SOMEPROPERTY WHEN 1 THEN X WHEN 2 THEN Y END

وهناك طريقة مدمجة وقابلة بسهولة:

UPDATE table1 SET val=ELT(FIND_IN_SET(someproperty, '1, 2'), X, Y);

وجعل الاستعلام بهذه الطريقة:

$condition = array(1, 2);
$newvals = array('X', 'Y');
$query = "UPDATE table1 SET val=ELT(FIND_IN_SET(someproperty, '". implode(',', $condition). "', ". implode(', ', $newvals). ")";

استخدم prepare_query لتجنب أخطاء في بناء الجملة SQL إذا كنت تتعامل مع قيم السلسلة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top