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

السؤال

نشر

لو كان لدي جدول بيانات يحتوي على حقول مختلفة منها ارقام الهواتف على سبيل المثال قمت انا بأدراج بيانات الهواتف في حقل 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
نشر
  بتاريخ On 9‏/3‏/2022 at 19:57 قال مروان مروان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
نشر
  بتاريخ On 10‏/3‏/2022 at 18:43 قال مروان مروان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
نشر
  بتاريخ On 10‏/3‏/2022 at 19:06 قال مروان مروان3:

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

أظهر المزيد  

آخر تعديل 

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

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

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

  • 1
نشر
  بتاريخ On 11‏/3‏/2022 at 12:02 قال مروان مروان3:

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

أظهر المزيد  

أهلا بك،

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

  • 1
نشر
  بتاريخ On 11‏/3‏/2022 at 17:11 قال مروان مروان3:

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

أظهر المزيد  

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

لذلك نستخدم substring

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

 

  • 0
نشر
  بتاريخ On 9‏/3‏/2022 at 18:42 قال 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
نشر
  بتاريخ On 9‏/3‏/2022 at 20:46 قال 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
نشر
  بتاريخ On 10‏/3‏/2022 at 18:57 قال 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
نشر (معدل)
  بتاريخ On 10‏/3‏/2022 at 19:13 قال 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
نشر
  بتاريخ On 11‏/3‏/2022 at 11:01 قال مروان مروان3:

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

أظهر المزيد  

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

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

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

  • 0
نشر (معدل)
  بتاريخ On 11‏/3‏/2022 at 11:47 قال 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
نشر
  بتاريخ On 11‏/3‏/2022 at 12:50 قال 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.

  • إعلانات

  • تابعنا على



×
×
  • أضف...