اذهب إلى المحتوى

السؤال

نشر

لو كان لدي جدول بيانات يحتوي على حقول مختلفة منها ارقام الهواتف على سبيل المثال قمت انا بأدراج بيانات الهواتف في حقل phone من خلال أوامر sql- Insert () واصبح لدي على سبيل المثال حقول بيانات تحتوي على تسلسل ID  من رقم 1 الى 100

ثم اصبح لدي بيانات مختلفة وليكون أسماء وانا امتلك عمود اسمه Name  ولكن ارغب بإضافة الأسماء حسب تسلسل ارقام الهواتف ولكن ليس من البداية بمعنى ارغب بأدراج من تسلسل   ID  مثلا  8 وحتى 34  فقط

وسيكوون في نفس موقع  row الذي سابقا وضعنا ارقام هواتف فيه 

رسم توضيحي :

هذا اول مرحلة قمت بها : 

انا اقوم بتنفيذ ذلك من خلال صفحة MySQL مباشر ولا استعمل صفحة php  لفعل ذلك 

صورة لتوضيح : 

6228ef082435c_Screenshot2022-03-09221626.thumb.png.10fca5bd23b416d44d5c92ec210016e7.png

حاولت القيام بشي مثل ذلك :

INSERT INTO employees 
  (Name) 
VALUES 
  (('ahame'),
   ('sfgtg'),
  ('yosu') WHERE Id > 2594 AND id < 2592);
 

ولكن الامر لم ينجح 

من

+----+-------------------+------+--------+
| id | Name              | phone| Date   |
+----+-------------------+------+--------+
|  1 |                   |563824|        |   
|  2 |                   |525225|        |
|  3 |                   |546542|        |
|  4 |                   |464625|        |
|  5 |                   |654525|        |
|  6 |                   |849842|        |
|  7 |                   |654446|        |          
+----+-------------------+------+--------+

إلى

+----+-------------------+------+--------+
| id | Name              | phone| Date   |
+----+-------------------+------+--------+
|  1 |                   |563824|        |   
|  2 |                   |525225|        |
|  3 | Ali               |546542|        |
|  4 | Ahmad             |464625|        |
|  5 | Ayob              |654525|        |
|  6 |                   |849842|        |
|  7 |                   |654446|        |          
+----+-------------------+------+--------+

 

Recommended Posts

  • 1
نشر

mySQL لا تستعمل المصفوفات، لذلك كحل بديل عليك كتابة الأسماء جميها ضمن سلسلة نصية (بينهم فاصلة) و من ثم ضمن الحلقة نستخلص اسم لكل تكرار و نستعمله في الشيفرة، لتصبح كما يلي:

set @id1 := 5;
set @id2 := 10;

set @i := @id1;

SET @names = 'marwan,wael,adnan,sameh,eyad,';

while (LOCATE(',', @names) > 0) //@i <= @id2
do
    SET @name = ELT(1, @names);
    SET @names= SUBSTRING(@names, LOCATE(',',@names) + 1);

  UPDATE users SET userName = @name WHERE userId = @i;
set @i = @i + 1;
end while;

الحل النهائي::

BEGIN

set @id1 := 1;
set @id2 := 104;

set @i := @id1;


SET @names = '1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,'; 



select @i,@names,Locate(',', @names);
LABEL1: WHILE @names is not null and  @i < @id2 do
SET @Name = SUBSTRING_index(@names, ',',1);
select @i,@names,@name;
                                               
SET @names = SUBSTRING(@names, LOCATE(',', @names) + 1);

UPDATE employees SET NAME = @Name
WHERE
  id = @i;

 SET  @i = @i + 1;

END WHILE label1;
SET @Name = SUBSTRING_index(@names, ',',1);
select 'and finally' ,@i,@names,@name;
end

 

  • 1
نشر
بتاريخ 35 دقائق مضت قال مروان مروان3:

يظهر لدي الخطاء التالي: صورة مرفقة

يوجد نقص في الشيفرة يجب أن تكون بهذا الشكل:

DELIMITER //
CREATE PROCEDURE addNames()
BEGIN

set @id1 := 5;
set @id2 := 10;

set @i := @id1;

SET @names = 'marwan,wael,adnan,sameh,eyad,';

label1: WHILE (LOCATE(',', @names) > 0)
do
    SET @name = ELT(1, @names);
    SET @names= SUBSTRING(@names, LOCATE(',',@names) + 1);

  UPDATE users SET userName = @name WHERE userId = @i;
set @i = @i + 1;
end while label1;
end;

 

  • 1
نشر
بتاريخ 12 دقائق مضت قال مروان مروان3:

الكود كالتالي:

حاول التالي:

BEGIN
SET
  @id1 := 2595;

SET
  @id2 := 2592;

SET
  @i := @id1;

SET
  @names = 'marwan,wael,adnan,sameh,';

LABEL1: WHILE (Locate(',', @names) > 0) do
SET
  @Name = SUBSTRING(@names, 0, LOCATE(',', @names));

SET
  @names = Substring(@names, Locate(',', @names) + 1);

UPDATE
  employees
SET
  NAME = @Name
WHERE
  id = @i;

SET
  @i = @i + 1;

END WHILE label1;

END

استبدلت الدالة ELT ب substring

  • 1
نشر
بتاريخ 1 دقيقة مضت قال مروان مروان3:

اصبح الان يظهر الخانة فارغة مرفق لك صوره :

آخر تعديل 

  @Name = SUBSTRING(@names, 1, LOCATE(',', @names)-1);

لأن الدالة تأخذ أول عنصر بترقيم 1 و ليس 0

أرجو الانتباه، أن وضع الفاصلة في آخر السلسلة النصية إجباري

  • 1
نشر
بتاريخ 42 دقائق مضت قال مروان مروان3:

ولتعم الفائدة للجميع لقد عمل الكود الان طريقتك فعالة 100% كل الشكر لك الغالي

أهلا بك،

ملاحظة: Replace تستبدل جميع السلاسل الجزئية و في حال تكرار اسم ما، سيحدث مشكلة

  • 1
نشر
بتاريخ 1 دقيقة مضت قال مروان مروان3:

لنني حاولت ولم ينجح  الامر توقف الكود لدى اول row  فقط تم الإضافة في اول واحد

هذا بسبب استخدام replace سوف تستبدل أول كلمة يجدها بالفراغ و لكن سيطبق نفس الأمر على جميه الكلمات بين الفاصلة التي تساوي الكلمة المحذوفة..

لذلك نستخدم substring

SET @names = SUBSTRING(@names, LOCATE(',', @names) + 1);

 

  • 0
نشر
بتاريخ منذ ساعة مضت قال Wael Aljamal:

mySQL لا تستعمل المصفوفات، لذلك كحل بديل عليك كتابة الأسماء جميها ضمن سلسلة نصية (بينهم فاصلة) و من ثم ضمن الحلقة نستخلص اسم لكل تكرار و نستعمله في الشيفرة، لتصبح كما يلي:


set @id1 := 5;
set @id2 := 10;

set @i := @id1;

SET @names = 'marwan,wael,adnan,sameh,eyad,';

while (LOCATE(',', @names) > 0) //@i <= @id2
do
    SET @name = ELT(1, @names);
    SET @names= SUBSTRING(@names, LOCATE(',',@names) + 1);

  UPDATE users SET userName = @name WHERE userId = @i;
set @i = @i + 1;
end while;

 

مرحبا اخي الكريم

يظهر لدي الخطاء التالي: صورة مرفقة

622906828e7fa_Screenshot2022-03-09235613.thumb.png.8dcded13807041dc62c3270fc2300997.png

  • 0
نشر
بتاريخ 21 ساعات قال Wael Aljamal:

يوجد نقص في الشيفرة يجب أن تكون بهذا الشكل:


DELIMITER //
CREATE PROCEDURE addNames()
BEGIN

set @id1 := 5;
set @id2 := 10;

set @i := @id1;

SET @names = 'marwan,wael,adnan,sameh,eyad,';

label1: WHILE (LOCATE(',', @names) > 0)
do
    SET @name = ELT(1, @names);
    SET @names= SUBSTRING(@names, LOCATE(',',@names) + 1);

  UPDATE users SET userName = @name WHERE userId = @i;
set @i = @i + 1;
end while label1;
end;

 

مرحبا اخي الكريم

اعتذر على تأخر الرد أولا

بنسبة الى الحل هو يعمل بدون أخطاء الان ولكن المشكلة الوحيدة لما اعمل تشغيل للعملية يقوم بإضافة الأسماء في سطر واحد او في Row 1 / المفترض ان يقوم بتوزيع الأسماء على row  بشكل متسلسل.

مرفق لك صوره

622a4689dd958_Screenshot2022-03-10224201.png.ba3fa069833513b94e1045fde2652238.png

 

الكود كالتالي:

BEGIN

set @id1 := 2595;
set @id2 := 2592;

set @i := @id1;

SET @names = 'marwan,wael,adnan,sameh,';

label1: WHILE (LOCATE(',', @names) > 0)
do
    SET @Name = ELT(1, @names);
    SET @names= SUBSTRING(@names, LOCATE(',',@names) + 1);

  UPDATE employees SET Name = @Name WHERE Id = @i;
set @i = @i + 1;
end while label1;
end

 

  • 0
نشر
بتاريخ 6 دقائق مضت قال Wael Aljamal:

حاول التالي:


BEGIN
SET
  @id1 := 2595;

SET
  @id2 := 2592;

SET
  @i := @id1;

SET
  @names = 'marwan,wael,adnan,sameh,';

LABEL1: WHILE (Locate(',', @names) > 0) do
SET
  @Name = SUBSTRING(@names, 0, LOCATE(',', @names));

SET
  @names = Substring(@names, Locate(',', @names) + 1);

UPDATE
  employees
SET
  NAME = @Name
WHERE
  id = @i;

SET
  @i = @i + 1;

END WHILE label1;

END

استبدلت الدالة ELT ب substring

اهلا اخي الكريم

اصبح الان يظهر الخانة فارغة مرفق لك صوره :

622a4c0bc4903_Screenshot2022-03-10230531.png.37937d412a1a7963d97cfcf00d33de97.png

  • 0
نشر (معدل)
بتاريخ 15 ساعات قال Wael Aljamal:

آخر تعديل 


  @Name = SUBSTRING(@names, 1, LOCATE(',', @names)-1);

لأن الدالة تأخذ أول عنصر بترقيم 1 و ليس 0

أرجو الانتباه، أن وضع الفاصلة في آخر السلسلة النصية إجباري

مرحبا بك اخي الكريم

حقيقه انا لم ارغب بطرح المزيد من الأسئلة حول هذا الفاكشن ولكني حاولت إيجاد حل للمشكلة ولم ينجح الامر حتى لا يطول السؤال ويسبب الازعاج

هيا تعمل بشكل جيد ولكن المشكلة انها تقوم فقط بإضافة اول اسم من الأسماء الموجودة وفي اول row  فقط ولا يتم استكمال الباقي 

 

BEGIN

set @id1 := 2591;
set @id2 := 2594;

set @i := @id1;

SET
  @names = 'marwan,wael,adnan,sameh,';

LABEL1: WHILE (Locate(',', @names) > 0) do
SET
  @Name = SUBSTRING(@names, 1, LOCATE(',', @names));

SET @names = SUBSTRING(@names,1, LOCATE(',', @names)-1);
UPDATE employees SET NAME = @Name
WHERE
  id = @i;

SET
  @i = @i + 1;

END WHILE label1;
end

 

بشكل التالي:

622b2c0191f22_Screenshot2022-03-11144017.png.bcd147aad7c69e2fea70a2427d4fca88.png

تم التعديل في بواسطة مروان مروان3
  • 0
نشر
بتاريخ 43 دقائق مضت قال مروان مروان3:

هيا تعمل بشكل جيد ولكن المشكلة انها تقوم فقط بإضافة اول اسم من الأسماء الموجودة وفي اول row  فقط ولا يتم استكمال الباقي

غريب، أنا جربت كلا الدالتين بشكل منفصل، اول مرو يقتطع الاسم ثم يتم حفظ الباقي في المتغير names ..

سأجرب حل جديد.. 

مشكلة SQL انها غير مرنة بشكل كاف 

  • 0
نشر (معدل)
بتاريخ 35 دقائق مضت قال Wael Aljamal:

غريب، أنا جربت كلا الدالتين بشكل منفصل، اول مرو يقتطع الاسم ثم يتم حفظ الباقي في المتغير names ..

سأجرب حل جديد.. 

مشكلة SQL انها غير مرنة بشكل كاف 

تحديث اخي الكريم

ولتعم الفائدة للجميع لقد عمل الكود الان طريقتك فعالة 100% كل الشكر لك الغالي

هذا التعديل النهائي:

BEGIN

set @id1 := 2591;
set @id2 := 2594;

set @i := @id1;

SET @names = 'marwan,wael,adnan,sameh,';
select @i,@names,Locate(',', @names);
LABEL1: WHILE @names is not null and  @i < @id2 do
SET @Name = SUBSTRING_index(@names, ',',1);
select @i,@names,@name;
SET @names = replace(@names,concat(@name,','),'');
UPDATE employees SET NAME = @Name
WHERE
  id = @i;

 SET  @i = @i + 1;

END WHILE label1;
SET @Name = SUBSTRING_index(@names, ',',1);
select 'and finally' ,@i,@names,@name;
end

 

تم التعديل في بواسطة مروان مروان3
  • 0
نشر
بتاريخ 3 ساعات قال Wael Aljamal:

أهلا بك،

ملاحظة: Replace تستبدل جميع السلاسل الجزئية و في حال تكرار اسم ما، سيحدث مشكلة

كل الشكر لك اخي الكريم جاري التجربة الان لنقل قاعدة البيانات لو نجحت بنسبة 95% الامر كافي بيكون

  • 0
نشر

@Wael Aljamal

اخي الكريم اذا كنت محتاج استبدال الاسماء بكلمات هل يمكن عملها بشكل التالي:

BEGIN

set @id1 := 1;
set @id2 := 104;

set @i := @id1;


SET @names = '1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,'; 



select @i,@names,Locate(',', @names);
LABEL1: WHILE @names is not null and  @i < @id2 do
SET @Name = SUBSTRING_index(@names, ',',1);
select @i,@names,@name;
SET @names = replace(@names,concat(@name,','),'');
UPDATE employees SET NAME = @Name
WHERE
  id = @i;

 SET  @i = @i + 1;

END WHILE label1;
SET @Name = SUBSTRING_index(@names, ',',1);
select 'and finally' ,@i,@names,@name;
end

لنني حاولت ولم ينجح  الامر توقف الكود لدى اول row  فقط تم الإضافة في اول واحد

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...