문제

그래서 나는 간단한 포럼을 만들려고 노력하고 있습니다. 주제 (답장이없는 경우) 또는 최신 답장 날짜까지 내림차순 주문의 주제 목록이됩니다. DB 구조는 다음과 같습니다.

포럼 _topic

ID, 이름, 이메일, 신체, 날짜

포럼 _reply

ID, 이메일, 신체, 날짜, Topic_id

포럼 자체는 다음 헤더가있는 HTML 테이블로 구성됩니다.

주제, 마지막 수정, # 답장

그러한 구조를 생성하려면 쿼리 나 쿼리가 어떤 모습일까요? 나는 그것이 크로스 조인을 포함 할 것이라고 생각했지만 확실하지 않다 ... 미리 감사드립니다.

도움이 되었습니까?

해결책

우선, Noboody가 실제로 당신의 질문에 대답하는 것 같습니다.

그러한 구조를 생성하려면 쿼리 나 쿼리가 어떤 모습일까요?

요청 된 구조와 함께

주제, last -modified, # 답장.

제공 한 테이블 구조를 고려할 때 해당 구조로 결과 테이블을 생성하는 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

(죄송합니다. 현재 MySQL에 액세스 할 수 없으므로 SQL Server에서만 테스트됩니다).

또한, 당신의 구조 이다 이미 정규화되었습니다. 그 반대의 제안은 사용자 이름을 추적하는 데 관심이 있다고 가정 할 때 원하는 것에 대해 가정하는 것입니다. 덧셈 이메일 주소로. 이것은 상당히 합리적이지만 그럼에도 불구하고 가정입니다. 정규화 관점에서 이메일 주소를 고유 한 사용자 식별자로 사용하여 잘못된 것은 없습니다.

이제 데이터베이스를 설정하는 방법에 대한 일반적인 제안을 찾고 있다면 많은 것을 제공 할 수 있습니다. 정규화하기 전에 잠재적 키워드를 객체 이름으로 사용하지 않는 것으로 시작합니다 (예 : '이름'및 '날짜'와 같은 열 이름을주지 마십시오).

답장이 없을 때 NULL 인 값에 대한 Matt의 의견과 관련하여 : Coalesce () 함수를 사용하면이를 수정합니다. Coalesce ()는 첫 번째 비 널 인수를 반환합니다 (또는 모든 인수가 널 인 경우 null). 따라서 MAX (R.Date)를 MAX (Coalesce (R.Date, T.Date))로 바꿉니다.

다른 팁

다소 다음과 같습니다.

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

그러나 사용하지 마십시오 select *

그것은 나쁜 연습입니다 :)

그리고 나는 당신이 정상화를 피하는 방식이 마음에 들지 않습니다! 차라리 가자는 것을 의미합니다.

사용자

  • userID
  • 이름
  • 이메일

스레드

  • threadid
  • 주제
  • 대답했다
  • 묻습니다
  • 날짜

답장

  • 답장
  • threadid
  • 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

"그룹"은 주제 당 하나의 행을주는 마술입니다. 맥스 () 그리고 세다() 기능이 필요한 집계 데이터를 제공합니다.

(편집 : 첫 번째 게시물의 본문이 주제 테이블에 있다는 것을 놓쳤으므로 답장이없는 게시물이 위의 쿼리에 의해 놓칠 것입니다. Filip은 데이터를 정규화하는 올바른 아이디어를 가지고 있습니다. 일단 정규화되면 위의 쿼리. 필요한 데이터를 얻을 수 있습니다).

"정규화"에 의해 "Forum_Topic"의 본문 열이 제거되어야하며 실제 주제 본문이 첫 번째 답변이어야한다는 것을 의미합니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top