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

ترتيب النتائج بعد عرضها من قاعدة البيانات

Hamada Ahmed

السؤال

هذا الكود يعرض الرسائل من قاعدة البيانات للرسائل الواردة للعضو - لكنه يعرض اقدم رسالة للعضو

كيف يمكن عرض احدث رسالة بدلا من اقدم رسالة

<?php

$stmt = $db->prepare('select * FROM messages WHERE recipient_id = ?  GROUP BY sender_id ORDER BY id DESC');
$stmt->bind_param('i', $_SESSION['id']);
$stmt->execute();
$result = $stmt->get_result();
while ($row = $result->fetch_assoc())
{
echo '<div class="div_messages"><a href="index.php?to='.$row['sender_id'].'"> تم استلام رسالة من  <br />'.$row['sender_name'].'<br />'.$row['date'].'</a></div>' ;
}
$stmt->close();
?> 

 

Caسسسpture.PNG

تم التعديل في بواسطة Hamada Ahmed
رابط هذا التعليق
شارك على الشبكات الإجتماعية

Recommended Posts

  • 1
بتاريخ 14 ساعات قال Hamada Ahmed:

يتم ترتيب الرسائل من الاحدث الى الاقدم فى القائمة المنسدلة - المشكلة فى عرض احدث رسالة للعضو فى عناصر القائمة - استخدام date يعطى نفس النتائج

أعتقد أن سبب المشكلة هو أن GROUB BY تقوم بأخذ أول صف فقط وبعد ذلك تتجاهل باقي الصفوف التي لها نفس قيمة sender_id، لذلك يمكنك تجربة جملة SQL التالية:

SELECT * FROM messages WHERE recipient_id = ? AND sender_id IN (SELECT DISTINCT sender_id FROM messages)

الجملة السابقة ستقوم أولًا بجلب الصفوف غير المكررة في العمود sender_id (أي أن قيم العمود sender_id لن تتكرر)، ثم تقوم بجلب أحدث رسالة فقط لكل مُرسِل sender.

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

في جملة SQL يبدو أنه يتم ترتريب الرسائل من خلال العمود id، بدلًا من ذلك يجب أن يكون الترتيب بناءًا على الوقت (أي من خلال العمود date)

<?php
$stmt = $db->prepare('select * FROM messages WHERE recipient_id = ?  GROUP BY sender_id ORDER BY date DESC');
$stmt->bind_param('i', $_SESSION['id']);
$stmt->execute();
$result = $stmt->get_result();
while ($row = $result->fetch_assoc()) {
  echo '<div class="div_messages"><a href="index.php?to='.$row['sender_id'].'"> تم استلام رسالة من  <br />'.$row['sender_name'].'<br />'.$row['date'].'</a></div>' ;
}
$stmt->close();

كما يمكنك أن تقوم بعكس ترتيب الرسائل تنازليًا أو تصاعديًا من خلال التبديل بين (DESC - ASC) في نهاية جملة SQL

بالتوفيق.

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 45 دقائق مضت قال سامح أشرف:

في جملة SQL يبدو أنه يتم ترتريب الرسائل من خلال العمود id، بدلًا من ذلك يجب أن يكون الترتيب بناءًا على الوقت (أي من خلال العمود date)


<?php
$stmt = $db->prepare('select * FROM messages WHERE recipient_id = ?  GROUP BY sender_id ORDER BY date DESC');
$stmt->bind_param('i', $_SESSION['id']);
$stmt->execute();
$result = $stmt->get_result();
while ($row = $result->fetch_assoc()) {
  echo '<div class="div_messages"><a href="index.php?to='.$row['sender_id'].'"> تم استلام رسالة من  <br />'.$row['sender_name'].'<br />'.$row['date'].'</a></div>' ;
}
$stmt->close();

كما يمكنك أن تقوم بعكس ترتيب الرسائل تنازليًا أو تصاعديًا من خلال التبديل بين (DESC - ASC) في نهاية جملة SQL

بالتوفيق.

يتم ترتيب الرسائل من الاحدث الى الاقدم فى القائمة المنسدلة - المشكلة فى عرض احدث رسالة للعضو فى عناصر القائمة - استخدام date يعطى نفس النتائج

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 4 ساعات قال سامح أشرف:

أعتقد أن سبب المشكلة هو أن GROUB BY تقوم بأخذ أول صف فقط وبعد ذلك تتجاهل باقي الصفوف التي لها نفس قيمة sender_id، لذلك يمكنك تجربة جملة SQL التالية:


SELECT * FROM messages WHERE recipient_id = ? AND sender_id IN (SELECT DISTINCT sender_id FROM messages)

الجملة السابقة ستقوم أولًا بجلب الصفوف غير المكررة في العمود sender_id (أي أن قيم العمود sender_id لن تتكرر)، ثم تقوم بجلب أحدث رسالة فقط لكل مُرسِل sender.

استخدام هذا الكود يكرر جميع الرسائل الواردة من العضو

يمكنك تجريب ذلك

 

messages.rar

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

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

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

لذلك يجب جلب الرسائل للمستقبل المحدد و ترتيبها و من ثم تجميعها كالتالي:

select * from 

(select * FROM messages 
		WHERE recipient_id = 1 ORDER BY id DESC) as T

GROUP BY T.sender_id

استبدل الرقم 1 بالمعرف الخاص بالمستقبل

رابط هذا التعليق
شارك على الشبكات الإجتماعية

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

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

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

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   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.

  • إعلانات

  • تابعنا على



×
×
  • أضف...