기본적으로 사용자가 팁, 설명 및 투표의 3 가지 정보를 입력 할 수있는 시스템이 있습니다. 이러한 정보는 3 개의 다른 테이블에 저장됩니다. 각 테이블의 연결 열은 사용자 ID입니다. 사용자가 세 가지 유형 중 하나의 정보를 전혀 가지고 있는지 확인하기 위해 쿼리를 수행하려고합니다. 하나의 쿼리에서이 작업을 수행하려고 시도하지만 완전히 잘못되었습니다. 여기에 내가 지금 함께 일하고 있어요 무엇 :이 투표이나 의견이 지정된 USER_ID에 의해 만들어진되지 않은 경우에도, 많은 투표를 위해 복제 만 팁을 받고있는 것 같다 또는 거기에 코멘트동일한 열이있는 여러 테이블의 결과 계산
SELECT DISTINCT
*
FROM tips T
LEFT JOIN comments C ON T.user_id = C.user_id
LEFT JOIN votes V ON T.user_id = V.user_id
WHERE T.user_id = 1
.
각 유형의 개별 개수가 아니라 하나의 숫자 만 필요합니다. 기본적으로 user_id 아래에 팁, 설명 및 득표 수의 합이 필요하지만 세 가지 쿼리를 수행하고 싶지 않습니다.
누구든지 아이디어가 있습니까?
편집 : 실제로 기술적으로 실제 계산할 필요는 없습니다. user_id가있는 세 테이블 중 하나에 행이 있는지 알아야합니다.
편집 2 : 나는 거의이 함께 있습니다
SELECT
COUNT(DISTINCT T.tip_id),
COUNT(DISTINCT C.tip_id),
COUNT(DISTINCT V.tip_id)
FROM tips T
LEFT JOIN comments C ON T.user_id = C.user_id
LEFT JOIN votes V ON T.user_id = V.user_id
WHERE T.user_id = 1
나는 USER_ID 1 테스트있어 (나). 나는 11 개의 팁을 만들었고 4 번 투표했으며 아무런 코멘트도 남기지 않았습니다. 내 반환은 3 열 : 11, 0, 4 행입니다. 적절한 계산입니다. 그러나 팁이나 설명을 작성하지 않은 사용자를 대상으로 테스트했지만 3 회 투표를 통해 모든 카운트에서 0을 반환하면 0, 0, 3이 반환됩니다.
'나는 그 WHERE 절을 사용하고있는 테이블에 user_id의 행이 없으면 다른 테이블에 해당 user_id 행이 있더라도 보드 전체에서 0을 얻는 것 같습니다. 나는이 쿼리를 사용할 수 있습니다 :
SELECT
(SELECT COUNT(*) FROM tips WHERE user_id = 2) +
(SELECT COUNT(*) FROM comments WHERE user_id = 2) +
(SELECT COUNT(*) FROM votes WHERE user_id = 2) AS total
그러나 저는 이것들이 서브 쿼리 일지라도 다수의 쿼리를 실행하는 것을 피하고 싶었습니다.
UPDATE 에이스
덕분에, 나는이 알아 낸 :
SELECT
(COUNT(DISTINCT T.tip_id) + COUNT(DISTINCT C.tip_id) + COUNT(DISTINCT V.tip_id)) AS total
FROM users U
LEFT JOIN tips T ON U.user_id = T.user_id
LEFT JOIN votes V ON U.user_id = V.user_id
LEFT JOIN comments C ON U.user_id = C.user_id
WHERE U.user_id = 4
사용자 테이블이 분명히 포함하여 사용자, 사용자 ID의 한판 승부 실제 정보가 포함되어 있습니다. 내가 다른 테이블에 없었더라도 사용자가 해당 테이블에 존재할 것이라는 것을 100 % 확신 할 수 있기 때문에 부모로 user 테이블을 사용했습니다. 나는이 쿼리로 원했던 적절한 수를 얻었다.
데이터베이스 디자인이 합리적이지 않은지 잘 모르겠습니다. 어쩌면 그럴 수도 있지만 보이지는 않습니다. –
그것은 완벽합니다. 사용자는 챌린지에 대한 팁을 게시합니다. 이 팁은 "팁"테이블로 보내지고 다른 것들 중에서 포스터의 user_id가 포함됩니다. 다른 사용자는 해당 팁에 주석을 달 수 있으며, 그 주석은 "주석"테이블로 전송되며 user_id도 포함됩니다. 마지막으로, 사용자는 팁에 투표 할 수 있으며, "votes"테이블에 저장되며 user_id도 포함됩니다. 이것이이를 수행하고 누가 어떤 게시물을 게시했는지 추적 할 수있는 유일한 방법입니다. 사용자가 투표를했는지 또는 팁이나 코멘트를 게시했는지 확인해야 표시 이름을 변경하는 것을 허용하거나 거부 할 수 있습니다. – HaLo2FrEeEk
0,0,3이 아닌 0,0,0을 얻는 이유는 기본 테이블이 user_id가없는 'tips'이고 user_id로'votes'가있는 'LEFT JOIN'입니다. 처음에는 모든 행이'tips'에서 얻을 것이고, 그러면'LEFT JOIN'을 다른 테이블과 함께 사용하면됩니다. MySql은'votes'에 포함 된 모든 user_id를 찾아서 결합합니다. 'LEFT table or tips'에없는 user_id는'votes'에서 제외되므로'vote'에 user_id를 넣지 않을 것입니다. 또한 열의 모든 동일한 값의 결과가 1로 계산되기 때문에 DISTINCT를 사용하여 문제가 발생합니다. – ace