당신은 기본적인 필요가 같이 할 수 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
적절한 'JOIN' 가능하다면'GROUP BY'를 사용합니다. 분석가가 없으면'shot_id '로 모든 필요한 테이블과 그룹을 조인 할 수 있습니다. 그것은 당신이 기대하는 결과에 가깝습니다. – Antoniossss
@OP 제발 포맷하지 마십시오 _a 질문 _ 정말 보이는 _ugly_ –
이 쿼리를 시도했지만 카운트를 검색하지 않습니다 : 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