2014-01-13 2 views
0

두 개의 테이블이 게임이라고하고 하나는 리뷰라고합니다.SQL 내부 조인 횟수

나는이 두 테이블을 결합하려고 시도하고 있으며 문서 및 다른 질문을 stackoverflow에서 살펴 보았습니다.

SELECT games.id, games.title, games.developer, reviews.review, reviews.review_title, 
(SELECT review, COUNT(*) 
FROM reviews 
GROUP BY review) AS Numberofreviews 
FROM games 
INNER JOIN reviews 
ON games.ean=reviews.games_ean; 

내가 시도한 쿼리는 게임 목록과 각 게임의 리뷰 수를 보여주는 표를 얻는 것입니다. 내가 위의 코드를 실행하려고하면

는하지만 난 오류 피연산자가 하나의 열

필자는이 오류가 다른 사람에 있지만 같은 상황에서보고를 포함해야 얻을.

어떤 도움을

편집 apprecatied 될 것이다 :이 MySQL을

+0

원하는 DDL 및/또는 sqlfiddle와 함께 원하는 결과 세트를 사용하십시오. – Strawberry

+0

DDL이란 무엇입니까? 죄송합니다. 데이터베이스가 – user3187726

+0

이고 google을 처음 사용하십니까? – Strawberry

답변

0

당신은 수를 얻을 수 reviews의 대신 from 절에 서브 쿼리를 이동해야합니다 : 그것은 review_title라는 컬럼을 가지고 이해가되지 않습니다

SELECT g.id, g.title, g.developer, r.Numberofreviews 
FROM games g inner join 
    (SELECT games_ean, COUNT(*) as Numberofreviews 
     FROM reviews 
     GROUP BY games_ean 
    ) r 
    on g.ean = r.games_ean; 

개 이상의 검토가있을 수 있기 때문이다.

+0

review_title 열은 나중에 사용자가 리뷰의 빠른 요약을 제출할 수 있도록 적용됩니다 (예 : 좋음/나쁨). 그러면 다른 사용자가 클릭하여 더 자세한 검토를받을 수 있습니다. 그 칼럼을 여기 전화 할 필요가 없다고 말한거야. – user3187726

1

함께 당신은 상관 하위 쿼리를 사용할 필요가 에러 것이 명확 하위 쿼리에서 하나의 열이 있어야 말한다

SELECT 
    g.id, 
    g.title, 
    g.developer, 

    (SELECT 
    COUNT(*) 
    FROM 
    reviews 
    WHERE games_ean = g.ean) AS Numberofreviews 
FROM 
    games g 
    INNER JOIN reviews r 
    ON g.ean = r.games_ean ; 
+0

리뷰를 r로 변경 한 것은 바로 단축하는 것입니까? – user3187726

+0

단축 할뿐만 아니라'WHERE games_ean = r.games_ean'처럼 하위 쿼리에서 별칭을 지정할 별칭을 제공합니다. –

+0

이 경우 모든 리뷰에 대해이 경우 모든 열에 대해 5이지만 모든 것을 얻으 려합니다. 각 게임은 – user3187726

-1

내가하려고하는 쿼리는 게임 목록과 각 게임에서받은 리뷰 수를 보여주는 표를 얻는 것입니다. 귀하의 하위 쿼리는 두 개의 열을 반환하기 때문에

SELECT games.id, games.title, games.developer, COUNT(DISTINCT reviews.*) as reviews_amount 
FROM games 
LEFT JOIN reviews ON games.ean = reviews.games_ean 
GROUP BY games.ean; 
+2

게다가 GROUP BY reviews.id는 의미가 없습니다. –

+0

DISTINCT 호출이 수행하는 작업 – user3187726

+0

@ user3187726 http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_count – Stafox

1

당신은 오류 "피연산자가 하나 개의 컬럼을 포함해야"얻는다. 이 상황에서는 하나만 허용됩니다. 그러나 하위 쿼리는 전혀 필요하지 않습니다. left join (NO 후기 경우) 및 aggregate 리뷰를 확인하십시오

SELECT games.*, COUNT(reviews.games_ean) 
    FROM games 
    LEFT JOIN reviews ON reviews.games_ean = games.ean 
    GROUP BY games.ean; 

나는 games.*games.ean에 의존 작동하는지 가정 (즉 games.ean가 유일하다).


이 사항이 나는 그룹화 된 문에 비 집계 속성에 투사에만 그룹화 된 속성에 대한 functionally depended있는 속성에 대해 정의 된 것을 강조하고 싶습니다 혼란을 일으킬 것으로 보인다으로. 따라서 성명서는 (games.ean이 고유하다는 가정하에) 유효하며 완벽하게 이해할 수 있습니다!

MySQL은 기능적으로 의존하지 않는 집계되지 않은 속성을 예상 할 수 있습니다! 그러나 그것들은 ANSI-SQL에 정의되어 있지 않으며 MySQL이 각 집계되지 않은 속성에 대해 하나의 정의되지 않은 값을 선택하기 때문에 결정적입니다.

+0

비 ANSI 표준 인'GROUP BY'를 사용하지 마십시오. – Kermit

+0

[MySQL이 SQL 표준과 충돌하는 기능을 추가하는 이유는 무엇입니까?] (http://stackoverflow.com/questions/7594865/why-does-mysql-add-a-feature-that-conflicts-with-sql-standards) – Kermit

+0

죄송합니다.하지만 준수하는 것 같습니다. games.ean은 기본 키가 아닐 수도 있지만 OP의 맥락에서'게임. * '은'games.ean'에 따라 기능이 다릅니다. 그렇지 않으면 외래 키로 사용하는 것이 타당하지 않습니다. 분쟁이있는 곳을 자세히 설명해주십시오. –