2014-09-18 2 views
-3

테이블 :모든 SELECT 문을 수행 함께

*shots* 
id user_id cat_id name extension size title description library created updated 

이 테이블은 모든 이미지


favorites 
id shot_id user_id date 

이 테이블은 모든 사용자의 마음에 드는 이미지를 추가 보유를 포함


stars 
id shot_id user_id date 

이 테이블은


views 
id shot_id user_id date 

이 표는 각 사용자


points 
id shot_id count date 

사용자의 모든 행동의 모든보기를 (포함 사용자의 이미지에 모든 주어진 별 보유 addFavvorite, giveStar, viewShot) 특정 샷에 점을 추가합니다.


하나의 쿼리로 다음 쿼리를 수행 할 수 있습니까?

SELECT * FROM shots WHERE id = ? 

단일 샷의 정보를 가져옵니다.

SELECT COUNT(*) FROM favorites WHERE shot_id = ? 

는이 장면을 방문하는 사람들의 수를 가져옵니다

SELECT COUNT(*) FROM star WHERE shot_id = ? 

는 스타

SELECT COUNT(*) FROM views WHERE shot_id = ? 

주고 사용자의 개수를 가져옵니다 자신의 즐겨 찾기에 샷을 추가 한 사용자의 개수를 가져옵니다

SELECT AVG(count) AS attention FROM points WHERE shot_id = ? AND date > DATE_SUB(DATE(),INTERVAL 2 DAY) ORDER BY shot_id 

전류 촬영의주의


(샷의 업로드 이후 점) 샷의

SELECT SUM(count) AS attention FROM points WHERE shot_id = ? ORDER BY shot_id 

인기 (평균은 지난 2 일에 점을 얻은) 그리고 내가 어떻게 관심과 인기를 기준 후 샷을 선택할 수 있습니다 (예 : (40)보다 큰 관심을 가지고있는 모든 샷을 보여, 100보다 큰 인기)

+0

적절한 'JOIN' 가능하다면'GROUP BY'를 사용합니다. 분석가가 없으면'shot_id '로 모든 필요한 테이블과 그룹을 조인 할 수 있습니다. 그것은 당신이 기대하는 결과에 가깝습니다. – Antoniossss

+0

@OP 제발 포맷하지 마십시오 _a 질문 _ 정말 보이는 _ugly_ –

+0

이 쿼리를 시도했지만 카운트를 검색하지 않습니다 : SELECT s. *, u.username, u.fullname, c.title AS ctitle, c. 설명 AS cdescription, COUNT (f.id) AS 즐겨 찾기, 별 COUNT 개 (st.id) AS 별, COUNT (v.id) AS 뷰에서보기 INNER JOIN 사용자 u u.id = s.user_id에 있음 INNER JOIN 카테고리 c ON c.id = s.cat_id INNER JOIN 즐겨 찾기 f ON f.shot_id = s.id INNER JOIN 별표가 st.shot_id = s.id INNER JOIN보기 v ON v.shot_id = s.id WHERE s.id = : shotId – Smeaven

답변

0

당신은 기본적인 필요가 같이 할 수 habe합니다 : -

SELECT s.id, 
    s.user_id, 
    s.cat_id, 
    s.name, 
    s.extension, 
    s.size, 
    s.title, 
    s.description, 
    s.library, 
    s.created, 
    s.updated, 
    u.username, 
    u.fullname, 
    c.title AS ctitle, 
    c.description AS cdescription, 
    COUNT(DISTINCT f.id) AS favorites, 
    COUNT(DISTINCT st.id) AS stars, 
    COUNT(DISTINCT v.id) AS views 
FROM shots s 
INNER JOIN users u ON u.id = s.user_id 
INNER JOIN categories c ON c.id = s.cat_id 
LEFT OUTER JOIN favorites f ON f.shot_id = s.id 
LEFT OUTER JOIN stars st ON st.shot_id = s.id 
LEFT OUTER JOIN views v ON v.shot_id = s.id 
WHERE s.id = 18 
GROUP BY s.id, 
    s.user_id, 
    s.cat_id, 
    s.name, 
    s.extension, 
    s.size, 
    s.title, 
    s.description, 
    s.library, 
    s.created, 
    s.updated, 
    u.username, 
    u.fullname, 
    ctitle, 
    cdescription 
ORDER BY s.id 

LEFT OUTER가 샷으로 사용 조인을 좋아하는/별 /보기가 없을 수도 있고 내부 결합으로 이러한 누락 중 하나가 기록을 반환하지 않을 것입니다.

또한 COUNT 사용

(DISTINCT를 ...) 샷에 대해 여러 즐겨 찾기가있을 수 있기 때문에, 좋아하는 ID가 여러 번 나타날 수 있습니다 (이 쿼리는 가능한 즐겨 찾기, 별 및 뷰의 모든 조합을 얻을 수 있기 때문에) .

질문의 두 번째 부분을 추가하려면 두 가지 하위 쿼리를 사용하십시오.

당신은 많은 촬영에 대한 세부 사항을 검색하고 있다면 아마 가장 빠른 서브 쿼리에 가입하여이 작업을 수행하려면 : - 다음 아마 최고의 단지 SELECT 부분에 하위 쿼리를 넣어

SELECT s.id, 
    s.user_id, 
    s.cat_id, 
    s.name, 
    s.extension, 
    s.size, 
    s.title, 
    s.description, 
    s.library, 
    s.created, 
    s.updated, 
    u.username, 
    u.fullname, 
    c.title AS ctitle, 
    c.description AS cdescription, 
    sub_att.current_attention, 
    sub_pop.popularity, 
    COUNT(DISTINCT f.id) AS favorites, 
    COUNT(DISTINCT st.id) AS stars, 
    COUNT(DISTINCT v.id) AS views 
FROM shots s 
INNER JOIN users u ON u.id = s.user_id 
INNER JOIN categories c ON c.id = s.cat_id 
LEFT OUTER JOIN 
(
    SELECT shot_id, AVG(count) AS current_attention 
    FROM points 
    WHERE date > DATE_SUB(DATE(),INTERVAL 2 DAY) 
    GROUP BY shot_id 
) sub_att ON sub_att.shot_id = s.id 
LEFT OUTER JOIN 
(
    SELECT shot_id, SUM(count) AS popularity 
    FROM points 
    GROUP BY shot_id 
) sub_pop ON sub_pop.shot_id = s.id 
LEFT OUTER JOIN favorites f ON f.shot_id = s.id 
LEFT OUTER JOIN stars st ON st.shot_id = s.id 
LEFT OUTER JOIN views v ON v.shot_id = s.id 
WHERE s.id = 18 
GROUP BY s.id, 
    s.user_id, 
    s.cat_id, 
    s.name, 
    s.extension, 
    s.size, 
    s.title, 
    s.description, 
    s.library, 
    s.created, 
    s.updated, 
    u.username, 
    u.fullname, 
    ctitle, 
    cdescription, 
    sub_att.current_attention, 
    sub_pop.popularity 
ORDER BY s.id 

을 하나의 샷을 위해 (이렇게하면 반환되는 각 레코드에 대해 하위 쿼리가 한 번씩 수행되므로 많은 레코드가 반환되므로 비효율적입니다.) -

SELECT s.id, 
    s.user_id, 
    s.cat_id, 
    s.name, 
    s.extension, 
    s.size, 
    s.title, 
    s.description, 
    s.library, 
    s.created, 
    s.updated, 
    u.username, 
    u.fullname, 
    c.title AS ctitle, 
    c.description AS cdescription, 
    (
     SELECT AVG(count) AS current_attention 
     FROM points 
     WHERE shot_id = s.id AND date > DATE_SUB(DATE(),INTERVAL 2 DAY) 
    ) AS current_attention, 
    (
     SELECT SUM(count) AS popularity 
     FROM points 
     WHERE shot_id = s.id 
    ) AS popularity, 
    COUNT(DISTINCT f.id) AS favorites, 
    COUNT(DISTINCT st.id) AS stars, 
    COUNT(DISTINCT v.id) AS views 
FROM shots s 
INNER JOIN users u ON u.id = s.user_id 
INNER JOIN categories c ON c.id = s.cat_id 
LEFT OUTER JOIN favorites f ON f.shot_id = s.id 
LEFT OUTER JOIN stars st ON st.shot_id = s.id 
LEFT OUTER JOIN views v ON v.shot_id = s.id 
WHERE s.id = 18 
GROUP BY s.id, 
    s.user_id, 
    s.cat_id, 
    s.name, 
    s.extension, 
    s.size, 
    s.title, 
    s.description, 
    s.library, 
    s.created, 
    s.updated, 
    u.username, 
    u.fullname, 
    ctitle, 
    cdescription, 
    sub_att.current_attention, 
    sub_pop.popularity 
ORDER BY s.id 
+0

대단히 감사합니다! 나는 너의 도움을 너무 많이 appletiate. 첫 번째 제안 된 쿼리는 작동하지만 두 번째 및 세 번째 쿼리는 작동하지 않습니다! Theres subquerys에 대한 문제 ... – Smeaven

+0

Sry, 저의 잘못. 그 'curdate() date() '! – Smeaven

관련 문제