2016-07-31 8 views
1

나는 사이트에서 퀴즈를 통해 다양한 수업에 학생 성적을 저장하는 데 사용되는 WordPress 사이트가 있습니다. 나는 특정 그룹 (buddypress 그룹을 사용하는)의 모든 학생들을위한 모든 수업과 각 레슨의 학생 성적을 추출하는 쿼리를 작성하려고합니다. 이것은 현재 그들이 테스트를 시도 교훈에 그룹의 모든 학생들에 대한 모든 성적을 반환값이 '등급'이거나 존재하지 않는 경우 검색 결과를 얻으십시오.

SELECT u.display_name, p.post_title, cm.meta_value 
FROM wp_users u 
JOIN wp_bp_groups_members gm 
    ON u.ID = gm.user_id 
JOIN wp_comments c 
    ON u.ID = c.user_id 
JOIN wp_commentmeta cm 
    ON c.comment_ID = cm.comment_id 
JOIN (SELECT * FROM wp_posts WHERE post_type LIKE 'lesson') p 
    ON c.comment_post_id = p.ID 
WHERE gm.group_id = 4 AND cm.meta_key LIKE 'grade' 

:

이 나는이 쿼리를 만들었습니다. 그러나 그것은 시험을 시도하지 않은 수업을 반환하지 않으며, 여전히 필요합니다.

레슨은 게시물이며, 성적은 meta_key가 '성적'인 레코드에서 meta_values입니다. 이들은 주석 및 comment_meta로 저장됩니다.

이 모든 것이 명확하고 도움이되기를 바랍니다. 감사.

그룹의 모든 학생의 성적뿐만 아니라 사람을 반환 거의 작동하지만
SELECT u.display_name, p.post_title, IFNULL(cm.meta_value,'--nothing--') grade 
FROM wp_users u 
JOIN wp_comments c 
LEFT JOIN wp_commentmeta cm 
    ON c.comment_ID = cm.comment_id AND cm.meta_key = 'grade' 
JOIN wp_bp_groups_members gm 
    ON u.ID = gm.user_id 
JOIN wp_posts p 
    ON c.comment_post_id = p.ID 
WHERE gm.group_id = 4 AND p.post_type LIKE 'lesson' 

(그것은 단지 그룹의 학생 중 하나 이름을 제공하지만) :

은 올리 존스 도움 후 나는이했다 .

답변

0

이는 익숙한 키/값 저장소 문제로, commentmeta, postsmetausermeta으로 나타납니다. JOIN 두 개의 테이블이 있고 왼쪽 테이블에 해당 행이 없을 경우 LEFT JOIN을 사용해야합니다. 왼쪽 키/값 표가있는 경우 ON 조건을 적절하게 조정해야합니다. 마지막으로, LEFT JOIN 두 개의 테이블과 거기에 일치하는 행이 없으면 해당 열의 경우 NULLs이 반환되므로 허용해야합니다.

그래서 SQL 패턴의이 종류는 귀하의 의견 테이블의 USER_ID가 있는가하면

SELECT whatever, IFNULL(cm.meta_value,'--nothing--') grade 
    FROM whatever 
    LEFT JOIN wp_comments c ON whatever.id = c.user_id 
    LEFT JOIN wp_commentmeta cm ON c.comment_id = cm.comment_id 
          AND cm.meta_key = 'grade' 
    JOIN whatever 
+0

도움을 주셔서 감사합니다. 분명히 나를 가까이에 데려갔습니다. 한 가지 문제가 있으므로 내 질문에 수정 사항을 추가했습니다. – DanR

+0

나는 이것을 답으로 이끌었던 것처럼 이것을 정확하게 표시하고있다. 나는 wp_comments와 wp_commentmeta 모두에 가입해야했다. 감사합니다. – DanR

+0

아, 고마워 해줘서 고마워. 나는 나의 대답을 업데이트했다. –

0

에 대한 트릭을 할 것입니다? 나는 어떤 사용자가 어떤 댓글을 게시했는지 알지 못합니다. 따라서 group_members를 users 테이블에 가입 시키면 표시 할 사용자를 지정하지만 주석 테이블에 가입 할 때 사용자 ID에 가입하지 않으므로 모든 사용자에 대한 모든 주석이 표시됩니다. 이 테이블을 위해 작동하지만 노력할 것입니다 경우 임 확실하지 :이 도움이

SELECT u.display_name, p.post_title, IFNULL(cm.meta_value,'--nothing--') grade 
FROM wp_users u 
LEFT JOIN wp_comments c 
    JOIN wp_commentmeta cm 
    ON c.comment_ID = cm.comment_id AND cm.meta_key = 'grade' 
    JOIN wp_bp_groups_members gm 
    ON c.user_ID = gm.user_id 
ON u.user_id = c.user_id 
JOIN wp_posts p 
ON c.comment_post_id = p.ID 
WHERE gm.group_id = 4 AND p.post_type LIKE 'lesson' 

희망!

+0

불행히도 학생이 테스트를 시도하지 않은 수업을 보여주지 않는 원래의 문제로 돌아갑니다. – DanR

+0

아마도 사용자 ID가 유지되는 곳이면 주석에 왼쪽으로 조인 할 필요가있을 것입니다. 위의 내 대답을 편집합니다. – user6655061