[英]mysql - how aright get count rows and max count in table?
查詢:
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.