4

タイトルの部分でこれ以上具体的に言うことはできませんでしたが、少し複雑なことをしたいと思います。やったと思ったのですが、バグであることが判明しました。

次のように3つのテーブルがあります。

プロジェクトテーブル

  • idProject
  • 題名
  • id所有者

オファーテーブル

  • idオファー
  • idProject
  • idアカウント

アカウント テーブル

  • idアカウント
  • ユーザー名

ここで、1 つのクエリで、ほとんどのオファーが行われたすべてのプロジェクトを一覧表示することを目指しています。クエリでは、所有者のユーザー名、オファー者のユーザー名などの詳細も取得したいと考えています*。したがって、再度クエリを実行する必要はありません。各プロジェクト。

これが壊れたクエリです。これは 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

*:Hosam Aly のおかげで意味のない例の追加情報を考え出そうとしただけで、何も考えずに書きました。

4

3 に答える 3

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
于 2012-09-17T13:33:49.103 に答える
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

このようにして、グループ化する他のすべてのフィールドに基づいているわけではありませんcount。または他のIDが他のテーブルに存在しない場合でも、データを返しますprojectidLEFT JOINprojectid

于 2012-09-17T13:33:13.507 に答える
1

あなたの質問は少し曖昧ですが、ここにいくつかの指針があります:

  • 「ほとんどのオファーが行われた」プロジェクトをリストするには、ORDER BY offercount.
  • GROUP BY Project.idProject基本的にプロジェクトのクエリを実行しているため、他のフィールドよりも先に行う必要があります。
  • 各プロジェクトで行われたオファーの数を照会していますが、オファーの詳細についても尋ねています。2 つの情報を一緒に要求することは (構文的に) 意味がありません。結果のすべてのレコードで繰り返されるオファーの総数と、オファー情報を取得する場合は、内部クエリを使用する必要があります。

内部クエリは、他の回答で示唆されているように句で作成することも、次のようFROMに句で直接作成することもできます。SELECT

SELECT Project.idProject,
       (SELECT COUNT(Offer.idOffer)
          FROM Offer
         WHERE Offer.idProject = Project.idProject
        ) AS OfferCount
  FROM Project
于 2012-09-17T13:40:56.183 に答える