繁体   English   中英

mysql-如何正确获取表中的计数行和最大计数?

[英]mysql - how aright get count rows and max count in table?

sqlfile上的结构表

查询:

SELECT 
ei.ItemIdn as ItemIdn,
ei.UserIdn as UserIdn,
ifnull(cb.BestPrice,0) as BestPrice,
cv.CountShow as CountShow,
cb.CountBids as CountBids,
ifnull(r.CountReactivation,0) as CountReactivation

FROM items ei

left join (
  SELECT count(*) as CountShow, ItemIdn 
  FROM CountViewes 
  WHERE ItemIdn = ItemIdn) as cv on cv.ItemIdn = ei.ItemIdn

left join (
  SELECT count(*) as CountBids, Max(Bid) as BestPrice, ItemIdn 
  FROM CountBids 
  WHERE ItemIdn = ItemIdn) as cb on cb.ItemIdn = ei.ItemIdn

left join (SELECT count(*) as CountReactivation, ItemIdn 
           FROM Reactivation 
           WHERE ItemIdn = ItemIdn) as r on r.ItemIdn = ei.ItemIdn

WHERE ei.UserIdn = '0000' 
LIMIT 0, 25

问题:如果我使用left join 联接 ,我只会得到一行(请参阅sqlfiddle ),但是表items有4行

告诉我,如何用left join获取行数和最大值?

您可以通过在子查询中进行聚合来解决此问题:

left join (SELECT ItemIdn, count(*) as CountBids, Max(Bid) as BestPrice
           FROM CountBids
           GROUP BY ItemIdn
          ) cb
          on cb.ItemIdn = ei.ItemIdn

编辑:

您需要将每个子查询中的ItemIdn = ItemIdn替换为group by ItemIdn 您还需要从外部查询中删除count()

SELECT 
    ei.ItemIdn as ItemIdn,
    ei.UserIdn as UserIdn,
    ifnull(cb.BestPrice,0) as BestPrice,
    cv.CountShow as CountShow,
    cb.CountBids as CountBids,
    ifnull(r.CountReactivation,0) as CountReactivation

FROM items ei

    left join (
      SELECT count(*) as CountShow, ItemIdn 
      FROM CountViewes 
      group by ItemIdn) as cv on cv.ItemIdn = ei.ItemIdn

    left join (
      SELECT count(*) as CountBids, Max(Bid) as BestPrice, ItemIdn 
      FROM CountBids  cb
      group by ItemIdn ) as cb on cb.ItemIdn = ei.ItemIdn

    left join (SELECT count(*) as CountReactivation, ItemIdn 
               FROM Reactivation
               group by ItemIdn) as r on r.ItemIdn = ei.ItemIdn

WHERE ei.UserIdn = '0000' ;

如果您确实打算在外部进行聚合,请使用sum() ,而不要使用count()

这应该工作:

SELECT 
    ei.DateStart as DateStart,
    ei.DateEnd as DateEnd,
    ei.ItemIdn as ItemIdn,
    ei.Title as Title,
    ei.AuctionMinCost as AuctionMinCost,
    ei.Priority as Priority,
    ei.PriceBuyOnly as PriceBuyOnly,
    ei.ItemCount as ItemCount,

    ifnull(MAX(cb.Bid),0) as BestPrice,
    count(cb.ItemIdn) as CountBids

FROM items ei
LEFT JOIN CountBids cb ON cb.ItemIdn = ei.ItemIdn

WHERE ei.User = '0' 
GROUP BY ei.ItemIdn
Order by ei.DateStart ASC 
LIMIT 0, 25

更新:

当与多个表联接并且需要将每个表分组时,您需要使用子查询。 每个子查询都需要进行自己的分组,您不必在主查询中使用聚合。

SELECT 
    ei.ItemIdn as ItemIdn,
    ei.UserIdn as UserIdn,
    ifnull(cb.BestPrice,0) as BestPrice,
    cv.CountShow as CountShow,
    cb.CountBids as CountBids,
    ifnull(r.CountReactivation,0) as CountReactivation

FROM items ei

    left join (
      SELECT count(*) as CountShow, ItemIdn 
      FROM CountViewes 
      GROUP BY ItemIdn) as cv on cv.ItemIdn = ei.ItemIdn

    left join (
      SELECT count(*) as CountBids, Max(Bid) as BestPrice, ItemIdn 
      FROM CountBids 
      GROUP BY ItemIdn) as cb on cb.ItemIdn = ei.ItemIdn

    left join (SELECT count(*) as CountReactivation, ItemIdn 
               FROM Reactivation 
               GROUP BY ItemIdn) as r on r.ItemIdn = ei.ItemIdn

WHERE ei.UserIdn = '0000' 
LIMIT 0, 25

小提琴

顺便说一句,查询中不需要WHERE ItemIdn = ItemIdn 如果查询没有条件,则只需忽略WHERE子句。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM