الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

كيف ادمج استعلامين

بدأه atlasarab في 18 يونيو 2011 · 10 رد · 629 مشاهدة · في منتدى تطوير المواقع بـ PHP
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

دايما عندما اسال سؤال تاتي الاجابة باني لم اسرد مشكلتي بشكل واضح لذلك قررت ان اسرد كل التفاصيل بدقة

انا عندي قاعدة بيانات فيها جدول users

id name pass

وعندي جدول ثاني هو يحتوي الاصدقاء وطبعا يعتمد على id الي هو موجود ب users

مفهوم الى الان

post-167206-068517900 1308392752_thumb.g

الجدول الثاني فيه id1 username1 id2 username2

id1 user name1 هو يعني الصديق الاول مثلا انت

id2 username2 يعني الصديق الثاني مثلا انا

طبعا انا خليت ايدي يوسر نيم حتى يصير اسرع ويقلل الاستعلام

الاستعلام يشتغل بشكل سليم لكنه استعلامين

$id =5;
$article1 = $mysql->query("select one ,first from frnds  where two = ".$id);
while($ar1 = $mysql->fetch_array($article1)){
	$art1[] = $ar1;
}

$smarty->assign('art1', $art1);

$article2 = $mysql->query("select two ,scnd from frnds  where one = ".$id);
while($ar2 = $mysql->fetch_array($article2)){
	$art2[] = $ar2;
}
echo '<br><br><br>';
array_unique;
$smarty->assign('art2', $art2);

انا جربت union لكن لم تعمل معي اتصور لأنه نفس الجدول

ف سؤالي هو كيف اربط استعلامين بنفس الجدول

او اذا فيه استعلام واحد يكون افضل بكثير

اخي لا تقل لم افهم لاني شرحت كل شئ تقريبا

وشكرا

post-167206-068517900 1308392752_thumb.g

المرفقات
data.gif
#2

لم أفهم :D

صديقي هل تريد احضار أصدقاء فلان + هو صديق لمن في استعلام واحد؟

بكل الأحوال جمع الاستعلامين بـ Union تعمل بشكل جيد حتى وإن كانت من ذات الجدول

ولكن union ستعيد لك أصدقاء فلان + هو صديق لمن تحت حقلي one,first أو تحت two,second بحسب اسم الحقلين الموجودين في الاستعلام الأول وهذا غير منطقي

استخدام union يكون منطقي فقط عندما تريد الاستعلام عن حقول تحمل ذات الاسم من عدة جداول(أو بعض الحالات الخاصة الأخرى كحقول تحمل نفس الهدف باسماء مختلفة في جداول مختلفة) ولكن في حالتك اسماء الحقول مختلفة (وتحمل هدف مختلف نسبياً)

على كل حال هذا الاستعلام قمت بتجربته ولا يعطي مشاكل

mysql_query("SELECT `one` , `first`
FROM `frnds`
WHERE `two` =1
UNION SELECT `two` , `second`
FROM `frnds`
WHERE `one` =1");

يمكنك القيام بالتالي و هذا أفضل لكي تستطيع الفصل بين حال كان فلان صديق لأحد أم هو له صديق

mysql_query("SELECT *
FROM `frnds`
WHERE `two` =1 OR `one` = 1");

عندها يمكنك فلترة الحقول (في المصفوفة المرجعة من الاستعلام) بحيث تعرض جميع اسماء المستخدمين عدا اسم المستخدم صاحب الـ id و ستحصل على النتيجة ضمن حقولها الصحيحة

إن كان ما تريد بعيد عما قمت بشرحه.. وضح لنا ما تريده بالضبط

بتوفيق الله...

تم تعديل هذه المشاركة بواسطة MoHaMMaD Pro في 18 يونيو 2011 في 17:37

Everything will be fine when we TALK LESS, DO MORE


#3

اخوي هل قصد دمج بين جدولين

واذا كان هكذا قصدك فاستخدم inner join

او اخي العزيز اذا تريد ان يكون استعلام واحد فهكذا

وهذا مثال :

$mysql->query("select one ,first from frnds  where two= '".$id."' or one='".$id."');

ورد خبر اذا كان هذا قصدك

تم تعديل هذه المشاركة بواسطة dr.php5 في 18 يونيو 2011 في 17:41

نسخة AGF العربية

النسخة قيد التطوير

رابط النسخة التجريبية

موقع النسخة الرسمي

شعار النسخة :

http://golden-forum.tk/AGF/styles/images/logo.png

<?php
echo ("I love php code ");
print(" Golden Forum Arab");
?>
#4

السلام عليكم

شكرا على الاهتمام

انا عندما استخدمت union بالضبط مثلك اخي MoHaMMaD Pro

لا اعلم لمذا لم تعمل

على كلا

و بالضبط استخدمت استعلامك الثاني لكنها تزيد بالتكرار يعني لازم ادخلها للفلترة

و اتصور اذا زاد حجم قاعدة البيانات وتزيد الفلترة يعني بطئ بالاستعلام

ف الان اجرب الاستعلام ب union مرة اخرى

لم تعمل union

ممكن طريقة للفلترة تنفع

وشكرا

فقط طريقة للفلترة لان عندي مصفوفة

ستفيدني الفلترة بالوقت الحاضر

وشكرا

#6

غريب لماذا لا تعمل لديك الـ Union هل ترد لك أي خطأ؟

على كل حال يمكنك الفلترة كالتالي مثلاً :

$id = 1;
$frnds = array();
$frnd_to = array();
$res = mysql_query("SELECT *
FROM `frnds`
WHERE `two` =$id OR `one` =$id 
");
while($row = mysql_fetch_assoc($res)) {
if( $row['one'] == $id )
array_push($frnd_to,$row['second']);
else
array_push($frnds,$row['first']);
}

أو يمكنك جعلها مصفوفة ثنائية البعد تحوي على الـ ID و اسم المستخدم لكل شخص كالتالي مثلا :

$id = 1;
$frnds = array();
$frnd_to = array();
$res = mysql_query("SELECT *
FROM `frnds`
WHERE `two` =$id OR `one` =$id 
");
while($row = mysql_fetch_assoc($res)) {
if( $row['one'] == $id )
array_push($frnd_to,array($row['two'],$row['second']));
else
array_push($frnds,array($row['one'],$row['first']));
}

لديك الآن مصفوفتين كل واحدة منهما تعبر عن استعلام من الاستعلامين الذين دمجناهما

Everything will be fine when we TALK LESS, DO MORE


#8

السلام عليكم

الضاهر ابقى على استعلامي القديم افضل

لم ينفع شئ

بالنسبة للفلتره تعكس الي انا اريده

انا حقا ضعيف بالمصفوفات

المطلوب ان id لا يجب ان يضهر

و لكن بالفلترة الي موجودة بهذه الصيغه

تقريبا بس صاحب id الي يضهر

وشكرا

اخي انا ازعجتك لكني يائس

شكرا

شكرا انا نفيت الشرط و اشتغل بس ينقصة تعديل شوي

شكرا

اخي ممكن الفلترة تكون

مصفوفة واحدة

بحيث يكون id username

وبس

#9

لا بأس أخي

لكن عليك أن تعلم جيداً بأن البرمجة و اليأس لا يجتمعان أبداً :D

اسم المستخدم لصاحب الـ id الذي نستعلم عنه من المستحيل وجوده ضمن قيم المصفوفتين

إذا كنت تقصد أن هناك اسماء مستخدم مكررة ضمن قيم المصفوفة الواحدة فهذا أمر آخر يمكن معالجته

هل يمكنك طباعة قيم المصفوفتين كالتالي :

print_r($frnd_to);
echo "<br>";
print_r($frnds);

على كل حال إن يأست حقاً و قررت العمل على طريقتك فتجاهل هذا الرد و أكمل عملك كما تحب

بالتوفيق...

Everything will be fine when we TALK LESS, DO MORE


مواضيع مشابهة