4

我不能在标题部分更具体,但我想为我做一些有点复杂的事情。我以为我做到了,但结果证明它是错误的。

我有以下三个表:

项目表

  • idProject
  • 标题
  • idOwner

报价表

  • idOffer
  • idProject
  • 身份证号

帐户表

  • 身份证号
  • 用户名

现在在一个查询中,我的目标是列出所有提供最多报价的项目,并且在查询中我还想获取所有者的用户名、提供者的用户名*等详细信息。所以我不必再次查询每个项目。

这是我损坏的查询,这是我对 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不是projectid基于您分组所依据的所有其他字段。LEFT JOIN如果其他表中不存在该或其他 id,我也会使用 a projectid,您仍将返回数据。

于 2012-09-17T13:33:13.507 回答
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
于 2012-09-17T13:40:56.183 回答