Pergunta

Então, eu estou tentando construir um fórum simples. Vai ser uma lista de tópicos em ordem decrescente pela data de apresentação do tema (se não houver respostas) ou mais recente resposta. Aqui está a estrutura DB:

forum_topic

id, nome, e-mail, o corpo, a data

forum_reply

id, email, corpo, data, topic_id

O próprio fórum será composto de uma tabela HTML com os seguintes cabeçalhos:

Topic, última modificação, # Respostas

O que a consulta ou consultas parecer para produzir tal estrutura um? Eu estava pensando que iria envolver uma junção cruzada, mas não tenho certeza ... Obrigado antecipadamente.

Foi útil?

Solução

Em primeiro lugar, parece-me noboody está realmente respondendo à sua pergunta, o que era:

O que a consulta ou consultas parecer para produzir uma tal estrutura?

com uma estrutura solicitada

Topic, LastModified, # Respostas.

O SQL para produzir uma tabela de resultados com essa estrutura, dadas as estruturas de tabela que você forneceu, seria:

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

(desculpe, essa é testada apenas em SQL Server, como eu não tenho acesso a MySql no momento)

Além disso, sua estrutura é já normalizou. Sugestões em contrário estão fazendo suposições sobre o que você quer fazer, por exemplo, supondo que você está interessado em acompanhar nomes de usuário em além para endereços de e-mail. Este é bastante razoável, mas é, no entanto, uma suposição. Não há nada errado, de uma perspectiva de normalização, com o uso de e-mail como um identificador de usuário exclusivo.

Agora, se você está procurando sugestões gerais sobre como configurar um banco de dados, podemos dar-lhe muitos daqueles. Antes de normalização, gostaria de começar com não usar palavras-chave potenciais como nomes de objetos (por exemplo, não dão colunas nomes como 'Nome' e 'Data').

Quanto ao comentário de Matt sobre o valor ser NULL quando não há respostas: usar a função COALESCE () vai corrigir isso. COALESCE () retorna o primeiro argumento não-NULL (ou NULL se todos os argumentos são NULL). Então substituir o MAX (r.Date) com MAX (COALESCE (r.Date, t.Date)).

Outras dicas

Um pouco como isto:

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

No entanto, não use select *

Isso é má prática:)

E eu não gosto da maneira como você evitar normalização! Significado Eu preferiria ter:

Usuários

  • UserID
  • Nome
  • E-mail

Threads

  • ThreadID
  • Assunto
  • respondidas
  • AskedByUserID
  • Data

Resposta

  • ReplyID
  • ThreadID
  • UserID
  • Resposta
  • Data

Depois de selecionar um segmento como este:

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

e selecionando todas as respostas como este

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

Agora, este foi apenas escrito a partir do topo da minha cabeça, mas você pode precisar adicionar algum grupo por bem.

Sim, você deve ser capaz de obtê-lo com uma consulta como esta:

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

O "grupo por" é a mágica que nos dá uma linha por tópico, com o MAX () e COUNT () funções, dando-nos os dados agregados que você precisa.

(EDIT:.. Eu perdi que o corpo do primeiro post foi na mesa o tema, de modo mensagens sem respostas que ficam esquecidos pela consulta acima Filip tem a idéia certa sugerindo que você normalizar seus dados Uma vez normalizado , uma consulta semelhante ao acima iria ler-lhe os dados que você precisa).

Por "normalizado", você quer dizer que a coluna de corpo de "forum_topic" deve ser removido, eo corpo tópico real deve ser a primeira resposta?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top