2010-04-21 2 views
1

안녕하세요 여러분, 현재 각 사용자의 주제에 대한 최신 의견을 찾은 다음 그 의견의 타임 스탬프별로 주제를 주문합니다. 내가 원하는 것은이 쿼리의 사용을 확장하고 각 항목에 대한 최신 코멘트를 인쇄하는 것입니다.이 쿼리의 문제는 항목을 올바르게 주문하는 동안 각 항목에 대해 임의의 주석이 보이는 것처럼 보입니다. 하위 쿼리를 구현하려고하지만 접근 방법을 잘 모르겠습니다. 내가 어떻게 든이 쿼리를 사용하여 코멘트를 얻어야한다고 생각했다. 누구든지 어떤 아이디어라도 갖고 있다면 정말 고마워 할 것입니다. 여기 하위 쿼리/그룹/주문에 대한 도움이 필요합니다. (주문한 각 주제에 대한 최신 의견을 얻으십시오.)

내가 여기

SELECT * FROM comments where topic_id='$topic_id' ORDER BY timestamp DESC LIMIT 1 

내가 당신의 $의 주 var에 무엇을하고 있는지

SELECT topic.topic_title, topic.content_type, topic.subject_id, topic.creator, topic.description, topic.topic_id,comments.message,comments.user 
     FROM comments 
     JOIN topic ON topic.topic_id = comments.topic_id 
     WHERE topic.creator = '$user' AND comments.timestamp > $week 
     GROUP BY topic_id ORDER BY MAX(comments.timestamp) DESC 

답변

2

이 자주 스택 오버플로에 나오면 가장 큰-N 당 그룹 문제의 예입니다. 더 많은 예제를 보려면 태그를 따르십시오.

SELECT t.topic_title, t.content_type, t.subject_id, t.creator, t.description, 
    t.topic_id, c1.message, c1.user 
FROM topic t 
JOIN comments c1 ON (t.topic_id = c1.topic_id) 
LEFT OUTER JOIN comments c2 
    ON (t.topic_id = c2.topic_id AND c1.timestamp < c2.timestamp) 
WHERE t.creator = ? AND c1.timestamp > ? 
    AND c2.topic_id IS NULL 
ORDER BY c1.timestamp DESC; 

PS : 동적 값 사용할 쿼리 매개 변수 (?)는 SQL 인젝션의 위험을 감소시킨다.

+0

매력 빌과 같이 작동합니다. 성능 문제가있을 수 있다고 생각되는 하위 쿼리 없이도 작업을 수행했습니다. (?) 제안에 관해서는, 나는 이것들이 준비된 진술에 사용되었다는 것을 이해한다. 나는 모든 mysql 문을 mysqli prepared statements로 대체 할 계획이다. 참고 문헌에 대한 좋은 제안이 있는가? – Scarface

+1

필자는 PDO를 선호합니다. 매개 변수의 사용법은 mysqli보다 훨씬 간단합니다. 그렇게 어렵지는 않습니다. 예를 들어 문서에 좋은 예가 있습니다. http://php.net/manual/en/pdo.prepare.php –

+0

Bill에게 다시 한 번 감사드립니다. – Scarface

0

확실하지 않음을 수정해야하는 쿼리입니다 추가 할 필요가 있다고 생각하지만, 무엇인가 나는 그것이 형식화 된 날짜가되기를 바랍니다.

어때요? 나는 느린 것입니다 생각하지만, 마음에 와서 제일 먼저 :

SELECT t.topic_title, t.content_type, t.subject_id, t.creator, 
    t.description, t.topic_id, c.message, c.user 
FROM topic t 
INNER JOIN comments c 
    ON t.topic_id = c.topic_id 
    AND c.comment_id = (select max(c2.comment_id) 
        from comments c2 
        where c2.topic_id = topic.topic_id) 
WHERE t.creator = '$user' 
    AND c.timestamp > $week 
0
select t.topic_title, t.content_type, t.subject_id, t.creator, t.description, t.topic_id, c.message, c.user 
from comments c 
inner join (
    SELECT cc.topic_id, max(cc.timestamp) as MaxTimestamp 
    FROM comments cc 
    inner JOIN topic t ON t.topic_id = cc.topic_id 
    WHERE t.creator = '$user' AND cc.timestamp > $week  
    group by cc.topic_id 
) cm on c.topic_id = cm.topic_id and c.timestamp = cm.MaxTimestamp 
inner JOIN topic t ON t.topic_id = c.topic_id 
관련 문제