2015-06-20 87 views
1

我有一个非常大的查询,它被ajax调用用来返回并排序活动项目。根据我的理解,在可能的情况下应该避免子查询,并且由于这个查询会经常被调用,所以我想这样做。MySQL - 在GROUP BY查询中遇到COUNT()问题

目前一切都很好,除了COUNT(b.bic) AS bids。如果有两个(2)出价,则查询返回四(4),如果有四个,则返回8,依此类推。我尝试了其他列的分组...但没有运气。

一些表格。我希望每一列的名称都是非常明显的:

countries_ship - 每个项目都可以发往多个国家,因此item_id可以重复。

id item_id country_id ship_cost 

国家

id country_code country_name 

item_expire - 不知道是否应该item_expire有它自己的表。

id item_id exp_date 

出价 - 就像countries_ship,item_id可以重复。这是出价存储的地方。

id item_id user_id bid previous_bid bid_date 

查询:

$q = $this->db->mysqli->prepare(" 
SELECT c.ship_cost, 
c.item_id, 
co.country_name, 
co.id AS co_id, 
i.id, 
i.user_id, 
i.item_start, 
i.item_title, 
i.item_number, 
i.item_year, 
i.item_publisher, 
i.item_condition, 
i.item_description, 
i.item_location, 
e.exp_date AS exp_date, 
i.active, 
CAST(u.fb_id AS CHAR(50)) AS fb_id, 
u.user_pic, 
MAX(b.bid) AS maxbid, 
COUNT(b.bid) AS bids, 
p.publisher_name, 
t.tag_name 
FROM countries_ship c 
JOIN items i 
ON c.item_id = i.id 
JOIN item_expire e 
ON c.item_id = e.item_id 
JOIN users u 
ON i.user_id = u.id 
LEFT JOIN bids b 
ON i.id = b.item_id 
LEFT JOIN publishers p 
ON i.item_publisher = p.id 
LEFT JOIN tags_rel tr 
ON c.item_id = tr.item_id 
JOIN tags t 
ON t.id = tr.tag_id 
LEFT JOIN countries co 
ON i.item_location = co.id 
WHERE ".$where." 
GROUP BY c.item_id ORDER BY ".$order." ".$limit.""); 
+1

当使用聚合函数,你的所有选择都组列。在MySQL中,这是不必要的,但结果是“不可预知的”。最佳做法是加入用agg函数进行选择。 – venca

回答

0

您可以尝试

COUNT(distinct b.bic) AS bids

这会忽略因重复为连接