[英]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.