سؤال

لذا أحاول بناء منتدى بسيط.ستكون قائمة من الموضوعات في ترتيب تنازلي حسب تاريخ إما الموضوع (إذا كان أي ردود) أو أحدث رد.هنا DB هيكل:

forum_topic

id, name, email, الجسم, تاريخ

forum_reply

المعرف, البريد الإلكتروني, الجسم, تاريخ, topic_id

المنتدى نفسه سوف تتكون من جدول HTML مع العناوين التالية:

موضوع آخر تعديل # الردود

ما الاستعلام أو استفسارات تبدو لإنتاج مثل هذا الهيكل ؟ كنت أفكر أنها تنطوي على الصليب الانضمام ، ولكن ليس متأكد...شكرا مقدما.

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

المحلول

أولا: يبدو لي noboody هو في الواقع الإجابة على سؤالك الذي كان:

ما الاستعلام أو استفسارات تبدو لإنتاج مثل هذا الهيكل ؟

مع طلب هيكل

الموضوع LastModified, # الردود.

SQL لتحقيق نتيجة الجدول مع هيكل ، بالنظر إلى الجدول الهياكل التي قدمتها, ليكون:

SELECT t.Id, t.Name AS Topic, 
       MAX(r.Date) AS LastModified, 
       COUNT(*) AS NumReplies
FROM Forum_Topic t
LEFT OUTER JOIN Forum_Reply r ON t.id = r.topic_id
GROUP BY t.Id, t.Name

(آسف, هذا هو اختبار فقط على SQL Server, وأنا لم يكن لديك الوصول إلى الخلية في هذه اللحظة)

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

الآن, إذا كنت تبحث عن اقتراحات عامة حول كيفية إنشاء قاعدة بيانات, نحن يمكن ان تعطيك الكثير من هؤلاء.قبل التطبيع ، وأود أن تبدأ مع عدم استخدام الكلمات الرئيسية المحتملة وجوه الأسماء (على سبيل المثال ، لا تعطي الأعمدة أسماء مثل 'اسم' و 'تاريخ').

بخصوص التعليق من مات عن القيمة NULL عندما لا يكون هناك ردود:باستخدام تتجمع() وظيفة سيتم إصلاح ذلك.تتجمع() بإرجاع أول وسيطة فارغة (أو فارغة إذا كان كل حجج فارغة).لذلك محل ماكس(r.التاريخ) مع ماكس(تتجمع(r.تاريخ t.التاريخ)).

نصائح أخرى

إلى حد ما مثل هذا:

select * from forum_topic
inner join forum_reply on forum_topic.id=topc_id

ولكن لا تستخدم select *

هذه الممارسة السيئة :)

وأنا لا أحب الطريقة يمكنك تجنب التطبيع!يعني أنا أود أن يكون بدلا من:

المستخدمين

  • UserID
  • اسم
  • البريد الإلكتروني

المواضيع

  • رقم الموضوع
  • الموضوع
  • أجاب
  • AskedByUserID
  • تاريخ

الردود

  • ReplyID
  • رقم الموضوع
  • UserID
  • الجواب
  • تاريخ

ثم اختيار موضوع مثل هذا:

select ThreadID, Subject, Answered, AksedByUserID, Date from Threads

واختيار كل الردود مثل هذا

select Answer, Date, Name, Email from Threads
inner join Replies on Threads,ThreaID=Replies.ThreadID
inner join Users on AskedByUserID=UserID 
where Threads.ThreadID=xxx

الآن هذا كان مجرد مكتوب من أعلى رأسي ، ولكن قد تحتاج لإضافة بعض المجموعة من قبل كذلك.

نعم, يجب أن تكون قادرة على الحصول عليه مع استعلام مثل هذا:

SELECT 
  forum_topic.id, 
  forum_topic.name AS Topic,  
  MAX(forum_reply.date) AS Last_Modified, 
  count(*) AS  Replies
FROM forum_topic 
INNER JOIN forum_reply ON (forum_topic.id=forum_reply.topic_id)
GROUP BY forum_topic.id

"مجموعة من" هو السحر الذي يعطينا صف واحد في الموضوع ، ماكس() و عدد() وظائف تعطينا البيانات المجمعة التي تحتاج إليها.

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

من قبل "تطبيع" ، تعني أن الجسم عمود "forum_topic" يجب إزالة الفعلية الموضوع من الجسم يجب أن يكون أول رد ؟

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