Domanda

Quindi sto cercando di creare un semplice forum. Sarà un elenco di argomenti in ordine decrescente per data dell'argomento (se non ci sono risposte) o ultima risposta. Ecco la struttura del DB:

forum_topic

  

ID, nome, email, corpo, data

forum_reply

  

id, email, body, date, topic_id

Il forum stesso sarà costituito da una tabella HTML con le seguenti intestazioni:

  

Argomento, Ultima modifica, # risposte

Come sarebbe la query o le query per produrre una tale struttura? Pensavo che avrebbe comportato un cross join, ma non sono sicuro ... Grazie in anticipo.

È stato utile?

Soluzione

Prima di tutto, a me sembra che nessuno stia effettivamente rispondendo alla tua domanda, che era:

  

Come sarebbe la query o le query per produrre una tale struttura?

con una struttura richiesta di

Argomento, LastModified, # risposte.

L'SQL per produrre una tabella dei risultati con quella struttura, date le strutture della tabella fornite, sarebbe:

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

(scusate, questo è testato solo su SQL Server, poiché al momento non ho accesso a MySql)

Inoltre, la tua struttura È già normalizzata. Suggerimenti contrari fanno ipotesi su ciò che si desidera fare, ad esempio supponendo che si sia interessati a tenere traccia dei nomi degli utenti in aggiunta agli indirizzi e-mail. Questo è abbastanza ragionevole, ma è comunque un presupposto. Non c'è nulla di sbagliato, dal punto di vista della normalizzazione, nell'uso dell'indirizzo e-mail come identificativo utente univoco.

Ora, se stai cercando suggerimenti generali su come impostare un database, possiamo darti MOLTI. Prima della normalizzazione, inizierei con non usare potenziali parole chiave come nomi di oggetti (ad esempio, non dare nomi di colonne come "Nome" e "Data").

Per quanto riguarda il commento di Matt sul valore NULL quando non ci sono risposte: l'uso della funzione COALESCE () lo risolverà. COALESCE () restituisce il primo argomento non NULL (o NULL se tutti gli argomenti sono NULL). Quindi sostituire il MAX (r.Date) con MAX (COALESCE (r.Date, t.Date)).

Altri suggerimenti

Un po 'così:

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

Tuttavia, non utilizzare select *

È una cattiva pratica :)

E non mi piace il modo in cui eviti la normalizzazione! Significa che avrei preferito:

Utenti

  • UserID
  • Nome
  • E-mail

discussioni

  • ThreadID
  • Soggetto
  • Risposta
  • AskedByUserID
  • Data

Le risposte

  • ReplyID
  • ThreadID
  • UserID
  • risposta
  • Data

Quindi selezionando un thread come questo:

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

E selezionando tutte le risposte come questa

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

Ora questo è stato appena scritto dalla cima della mia testa, ma potresti aver bisogno di aggiungere anche un gruppo.

Sì, dovresti essere in grado di ottenerlo con una query come questa:

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

Il gruppo " per " è la magia che ci fornisce una riga per argomento, con MAX () e COUNT () ci fornisce i dati aggregati di cui hai bisogno.

(EDIT: ho perso che il corpo del primo post era nella tabella degli argomenti, quindi i post senza risposta sarebbero stati persi dalla query sopra. Filip ha l'idea giusta che suggerisce di normalizzare i tuoi dati. Una volta normalizzato , una query simile alla precedente ti fornirà i dati di cui hai bisogno).

Per " normalizzato " ;, intendi che la colonna body di " forum_topic " dovrebbe essere rimosso e il vero argomento dovrebbe essere la prima risposta?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top