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."");
當使用聚合函數,你的所有選擇都組列。在MySQL中,這是不必要的,但結果是「不可預知的」。最佳做法是加入用agg函數進行選擇。 – venca