Frage

So versuche ich, ein einfaches Forum zu bauen. Es wird eine Liste der Themen sein, um nach dem Datum der entweder das Thema absteigend (wenn keine Antworten) oder letzte Antwort. Hier ist die DB-Struktur:

forum_topic

  

id, name, E-Mail, Körper, Datum

forum_reply

  

id, E-Mail, Körper, Datum, topic_id

Das Forum selbst wird mit den folgenden Header einer HTML-Tabelle aus:

  

Thema, zuletzt aktualisiert, # Antworten

Was wäre die Abfrage oder Abfragen aussehen wie eine solche Struktur zu produzieren? Ich dachte, es wäre ein Cross Join beinhalten, aber nicht sicher ... Vielen Dank im Voraus.

War es hilfreich?

Lösung

Zunächst einmal, so scheint es mir noboody tatsächlich Ihre Frage zu beantworten, was war:

  

Was die Abfrage oder Abfragen aussehen würde eine solche Struktur produzieren?

mit einer angeforderten Struktur

Thema, LastModified, # Antworten.

Die SQL eine Ergebnistabelle mit dieser Struktur zu erzeugen, angesichts der Tabellenstrukturen Sie zur Verfügung gestellt, wäre:

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

(sorry, dies nur auf SQL Server getestet, wie ich im Moment keinen Zugriff auf MySQL)

Auch Ihre Struktur bereits normalisiert. Vorschläge für das Gegenteil machen Annahmen über das, was Sie tun wollen, zum Beispiel unter der Annahme, dass Sie bei der Verfolgung von Benutzername interessiert sind in zusätzlich Adressen E-Mail. Dies ist durchaus sinnvoll, aber es ist trotzdem eine Vermutung. Es ist nichts falsch, von einer Normalisierung Perspektive, mit der Verwendung von E-Mail-Adresse als eindeutige Benutzer-ID.

Wenn Sie nun für die allgemeine Vorschläge suchen, wie eine Datenbank einzurichten, können wir Ihnen viele von denen geben. Vor Normalisierung, würde ich mit nicht mit potenziellen Keywords als Objektnamen beginnen (zum Beispiel keine Spalten Namen geben wie ‚Name‘ und ‚Datum‘).

In Bezug auf den Kommentar von Matt über den Wert Wesen NULL, wenn es keine Antworten: mit der COALESCE () Funktion wird das in Ordnung bringen. COALESCE () gibt das erste Nicht-Null-Argument (oder null, wenn alle Argumente NULL sind). So ersetzen Sie die MAX (r.Date) mit MAX (COALESCE (r.Date, t.Date)).

Andere Tipps

Etwas wie folgt aus:

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

Jedoch nicht verwenden select *

Das ist eine schlechte Praxis:)

Und ich weiß nicht wie die Art und Weise Sie Normalisierung vermeiden! Bedeutung Ich hätte lieber:

Nutzer

  • UserID
  • Name
  • E-Mail

Themen

  • ThreadID
  • Betreff
  • Beantwortet
  • AskedByUserID
  • Datum

Antworten

  • ReplylD
  • ThreadID
  • UserID
  • Antwort
  • Datum

Dann ein Thema wie diese Auswahl:

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

Und alle Antworten wie diese Auswahl

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

Nun war dies nur aus der Spitze von meinem Kopf geschrieben, aber Sie könnten eine Gruppe von als auch hinzufügen müssen.

Ja, sollten Sie in der Lage sein, es mit einer Abfrage zu erhalten wie folgt:

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

Die „Gruppe“ ist die Magie, die uns eine Zeile pro Thema gibt, mit der MAX () und COUNT () Funktionen uns die aggregierten Daten, die Sie benötigen.

(EDIT:.. Ich vermisste, dass der Körper des ersten Beitrag im Thema Tisch war, so Beiträge ohne Antworten der obigen Abfrage verpasst bekommen würde Filip hat die richtige Idee was darauf hindeutet Sie Ihre Daten normalisieren Sobald normalisiert eine Abfrage ähnlich der oben würden Sie die Daten, die Sie benötigen) erhalten.

Mit dem „normalisiert“, meinen Sie, dass der Körper Spalte „forum_topic“ entfernt werden sollen, und die eigentliche Thema Körper sollten die erste Antwort sein?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top