簡體   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