2012-06-21 178 views
0

我有兩個表。 (MySQL數據庫) 活動:Mysql不能正常工作

id | title | ... 

Event_participate:

event_id | user_id | confirmed 

confirmed是0/1列。我想查找指定用戶參與的活動。我的SQL查詢是:

SELECT *, COALESCE(SUM(ep.confirmed), 0) AS count_members 
FROM event e 
LEFT JOIN event_participate ep ON e.id = ep.event_id 
GROUP BY ep.event_id 
HAVING (
ep.user_id = 6 
) 

我必須使用具有clasule,因爲我想擴大此查詢。 我有5個事件的結果,但是當我查詢此:

SELECT * 
FROM `event_participate` 
WHERE `user_id` = 6 

我有7條記錄。這怎麼可能?

我編輯了第二張表格的結構(event_participate) - 它可以幫助您理解爲什麼我想使用having clausule。當我使用WHERE時,我總是會在count_members中獲得1。

編輯: 我的目標是獲得特定用戶參與的活動,我想知道有多少用戶已參與這些活動。

例如用戶id = 6參與id = 1的一個事件。但有3個其他用戶參與事件id = 1。所以我應該得到一個事件,並在列count_members我應該得到4

回答

0

您需要將您的having子句更改爲where子句。 having子句不使用group-by列或聚合,因此它正在執行「any(user_id)= 6」。

SELECT * 
FROM event e LEFT JOIN event_participate ep ON e.id = ep.event_id 
WHERE ep.user_id = 6 
GROUP BY ep.event_id 

根據您的編輯,我想你想是這樣的:

SELECT ep.event_id, COALESCE(SUM(ep.confirmed), 0) AS count_members 
FROM event e LEFT JOIN event_participate ep ON e.id = ep.event_id 
GROUP BY ep.event_id 
HAVING max(case when ep.user_id = 6 then 1 else 0 end) = 1 

您正試圖限制人口有事件至少一個USER_ID = 6,同時還計算所有其他成員。此外

SELECT e.* 
FROM event e 
INNER JOIN event_participate ep 
    ON e.id = ep.event_id AND ep.user_id = 6 
+0

請檢查我的更新。 – latata

+0

您應該提供輸入數據的示例以及您想要生成的內容。我認爲從你提出的問題的方式來看,這是不明確的。 –

+0

已更新。現在檢查。 – latata

0

嘗試啓動這個

SELECT * 
FROM event e 
LEFT JOIN event_participate ep ON e.id = ep.event_id 
GROUP BY ep.event_id, ep.user_id 
HAVING (
ep.user_id = 6 
) 

注意,在此查詢的GROUP BY子句是多餘的,並具有可更換WHERE

0

,我嘗試解決您的查詢:

0

我想查找指定用戶參與的事件。

SELECT e.title 
FROM event e 
    JOIN event_participate ep ON e.id = ep.event_id 
WHERE 
    ep.user_id = 6; 

無需使用GROUP BY條款。您沒有彙總任何數據。