2012-09-17 2 views
4

제목 부분에서 더 구체적 일 수는 없지만 약간 복잡한 것을하고 싶습니다. 나는 내가 그것을했다라고 생각했다. 그러나 그것은 버킷이다라고 밝혀졌다.group by 및 join이 포함 된 SQL 쿼리

ProjectTable

  • idProject
  • 제목
  • idOwner

OfferTable

    :

    나는 다음과 같은 세 개의 테이블을 가지고

  • idOffer
  • idProject
  • idAccount

AccountTable

  • idAccount

지금 한 쿼리에서 내가 만든 대부분의 이벤트로 모든 프로젝트를 나열하는 것을 목표로 사용자 이름 , 쿼리에서 나는 또한 deta를 얻고 싶다. ils 소유자의 사용자 이름과 같은 봉납 자의 사용자 이름 * 등등. 그래서 나는 각 프로젝트에 대해 다시 질의 할 필요가 없다.

여기 내 부서진 쿼리입니다. GROUP BY를 사용한 첫 번째 실험이며 아마도 제대로 이해하지 못했을 것입니다.

SELECT Project.addDate,Project.idOwner ,Account.Username,Project.idProject, 
    Project.Price,COUNT(Project.idProject) as offercount 
FROM Project 
INNER JOIN Offer 
    ON Project.idProject= Offer.idProject 
INNER JOIN Account 
ON Account.idAccount = Project.idOwner 
GROUP BY Project.addDate,Project.idOwner, 
    Account.Username,Project.idProject,Project.Price 
ORDER BY addDate DESC 

* : 난 그냥 예를 들어 추가 정보를 마련하려고했다 생각하지 않고, 그 호삼 알리에 의미 덕분이라고 썼다.

답변

7

보십시오이 (어떤 이벤트와 프로젝트 수정) :

SELECT 
    Project.addDate, 
    Project.idOwner, 
    Account.Username, 
    Project.idProject, 
    Project.Price, 
    ISNULL(q.offercount, 0) AS offercount 
FROM 
    (
    SELECT 
     o.idProject, 
     COUNT(o.idProject) as offercount 
    FROM Offer o 
    GROUP BY o.idProject 
) AS q 
    RIGHT JOIN Project ON Project.idProject = q.idProject 
    INNER JOIN Account ON Account.idAccount = Project.idOwner 
ORDER BY addDate DESC 
+0

, 나는 COUNT'을 원합니다 (o.idOffer)', 우리는 실제로 제안이 아니라 프로젝트를 세고 있기 때문입니다. –

+0

@HosamAly, 공정한 소리. –

+0

이 쿼리는 0 제안과 함께 프로젝트를 반환합니까? 나는 이것을 실제 테이블 이름에 맞게 변경했지만, 실수를했는지 또는이 쿼리가 표시되지 않았는지 확실하지 않습니다. 마지막 두 조인 유형을'FULL 및 LEFT'으로 변경했습니다. 이제 0 일 때 NULL이됩니다. 문제가 아니며 코드로 쉽게 해결할 수 있지만 NULL을 0으로 만들려면 무엇을 변경해야하는지 배우고 싶습니다. – EralpB

1

나는이 약간 쿼리를 전환 할 수 있습니다

select p.addDate, 
    p.idOwner, 
    a.Username, 
    p.idProject, 
    p.price, 
    o.OfferCount 
from project p 
left join 
(
    select count(*) OfferCount, idproject 
    from offer 
    group by idproject 
) o 
    on p.idproject = o.idproject 
left join account a 
    on p.idowner = a.idaccount 

이 방법, 당신은 당신이에 의해 그룹화되어있는 다른 모든 필드를 기반으로 projectid 및하지 않음으로써 count을 얻고있다. 다른 테이블에 projectid 또는 다른 ID가없는 경우에도 LEFT JOIN을 사용하고 있지만 여전히 데이터를 반환합니다.

1

귀하의 질문이 조금 애매하지만, 여기에 몇 가지 포인터 :

  • 하여 만든 대부분의 이벤트와 프로젝트 "를 나열하려면 ", ORDER BY offercount.
  • 본질적으로 프로젝트를 쿼리하므로 다른 필드보다 먼저 GROUP BY Project.idProject을 사용해야합니다.
  • 각 프로젝트에 제공되는 오퍼 수를 쿼리하고 있지만 오퍼 세부 정보를 요청하십시오. 두 가지 정보를 함께 요구하는 것은 구문 적으로 의미가 없습니다.제안 정보와 함께 결과의 모든 레코드에서 반복되는 제안의 총 수를 얻고 싶다면이를 위해 내부 쿼리를 사용해야합니다.

이너 쿼리 중 하나 FROM 절에, 다른 답변에 의해 제안, 또는 직접 SELECT 절에,과 같이 할 수있다 : 명확성을 위해

SELECT Project.idProject, 
     (SELECT COUNT(Offer.idOffer) 
      FROM Offer 
     WHERE Offer.idProject = Project.idProject 
     ) AS OfferCount 
    FROM Project 
+0

네, 첫 번째 요점에 대해 옳았습니다. 다른 종류의 주문에 대해 3 가지 질문을하고 잘못된 것을 복사했습니다. 그리고 세 번째 점을 바로 잡았습니다. – EralpB