2011-05-14 75 views
0

所以我有一個問題關於LEFT JOIN,該代碼返回不同的值totalPoints取決於用戶是否得到了組與否。 (如果用戶沒有拿到團體或事件返回正確的值)問題與我LEFT JOIN,總結了它的結果,一個

我只是想掌握如何得到LEFT JOIN flow_ _vote ON flow_ _vote.flow_id = flows.id每次工作。我之前做了一個解決方案之前有三個查詢,一個獲取組和事件規則,一個檢查用戶是否得到組或事件考慮安全性和一個獲得流量...

而且我想我可以通過有兩個查詢來解決這個問題,一個可以獲取組和事件規則,另外還可以檢查用戶是否獲得了組和事件,然後根據用戶獲取流的應該有權訪問它。

現在我得到在一個查詢所需的每一個信息,然後檢查與IF語句是否應打印或不...

所以,我的問題是,是否有可能得到SUM(flow_ _vote.points)AS totalPoints以這種方式工作?你知道嗎?

而且我有點古怪,是一種查詢最好的方式來處理這個?在考慮性能時使用兩個是否合理?

SELECT 
     flows.id AS flowId, 
     flows.security, 
     SUM(flow__has__vote.points) AS totalPoints, 
     users.id AS userId, 
     users.alias, 
     flows.event_id AS eventId, 
     events.group_id AS groupId, 
     events.membershipRules AS eMR, 
     groups.membershipRules AS gMR, 
     user__has__group.permission AS userHasGroup, 
     user__has__event.permission AS userHasEvent 
    FROM 
     users, 
     events LEFT JOIN user__has__event ON user__has__event.user_id = '.$userId.', 
     groups LEFT JOIN user__has__group ON user__has__group.user_id = '.$userId.', 
     flows LEFT JOIN flow__has__vote ON flow__has__vote.flow_id=flows.id 
    WHERE 
     flows.user_id = users.id AND 
     events.id = flows.event_id AND 
     groups.id = events.group_id AND 
     flows.id='.$flowId 

如果你想知道的SQL語句是幹什麼的,獲得的流量(後),關於事件和組流量中的信息資料,檢查到該組的用戶訪問和事件也讓所有的票流...

這是表的樣子......

FLOWS id,security,event_id,user_id 
USERS id, alias 
EVENTS id, name group_id, membershipRules 
GROUPS id, name, membershipRules 
USER__HAS__GROUP user_id,group_id,permission 
USER__HAS__EVENT user_id,event_id,permission 
FLOW__HAS__VOTE flow_id,user_id,points 

這是我想對...

+--------+----------+-------------+--------+--------+---------+---------+-----+-----+--------------+--------------+ 
| flowId | security | totalPoints | userId | alias | eventId | groupId | eMR | gMR | userHasGroup | userHasEvent | 
+--------+----------+-------------+--------+--------+---------+---------+-----+-----+--------------+--------------+ 
|  1 | 2  | 1337  | 5  | Pontus | 15  | 2  | 2 | 2 | 4   | 4   | 
+--------+----------+-------------+--------+--------+---------+---------+-----+-----+--------------+--------------+ 
0的結果

和一個例子......

+--------+----------+-------------+--------+--------+---------+---------+-----+-----+--------------+--------------+ 
| flowId | security | totalPoints | userId | alias | eventId | groupId | eMR | gMR | userHasGroup | userHasEvent | 
+--------+----------+-------------+--------+--------+---------+---------+-----+-----+--------------+--------------+ 
|  1 | 2  | 1337  | 6  | Kezia | 15  | 2  | 2 | 2 | null   | null   | 
+--------+----------+-------------+--------+--------+---------+---------+-----+-----+--------------+--------------+ 

享受生活〜龐

+0

請張貼您的表格結構和關係。一些樣本數據和期望的結果也會非常有用。 – Galz 2011-05-14 10:58:22

+0

希望有足夠的關係在WHERE聲明中給出... – Pontus 2011-05-14 11:58:17

+0

仍在努力理解您的目標。你想獲得結果集中的所有事件,並在userHasEvent下查看這個用戶是否真的參與了這個事件? – Galz 2011-05-14 12:17:29

回答

0

所以,基本上要點(恕我直言)是不包括表,你LEFT JOINedWHERE子句中的條件,因爲這使得LEFT JOIN表現得像INNER JOIN

開始嘗試這種查詢(儘管我相信你會因爲我不知道你想要的結果到底是什麼,後面會詳細講解作出調整):

SELECT 
     flows.id AS flowId, 
     flows.security, 
     SUM(flow__has__vote.points) AS totalPoints, 
     users.id AS userId, 
     users.alias, 
     flows.event_id AS eventId, 
     events.group_id AS groupId, 
     events.membershipRules AS eMR, 
     groups.membershipRules AS gMR, 
     user__has__group.permission AS userHasGroup, 
     user__has__event.permission AS userHasEvent 
FROM users, 
LEFT JOIN user__has__event 
    ON user__has__event.user_id = users.id, 
LEFT JOIN events 
    ON user__has__event.event_id = events.id 

LEFT JOIN user__has__group 
    ON user__has__group.user_id = users.id, 
LEFT JOIN groups 
    ON user__has__group.group_id = groups.id 
    AND groups.id = events.group_id 

LEFT JOIN flows 
    ON flows.user_id = users.id 
    AND events.id = flows.event_id 
    AND flows.id='.$flowId' 
LEFT JOIN flow__has__vote 
    ON flow__has__vote.flow_id = flows.id 

WHERE users.id = '.$userId.' 
GROUP BY users.id 

在這裏,我LEFT JOINed一切交給用戶,也由用戶分組。我有一種感覺,你會想要添加列(flows.id ?, events.id?)

此外,您可能需要將LEFT JOINs中的一些設置爲JOIN,因此,例如,您將只獲得具有「流量」的用戶。

+0

嘿加爾茲,感謝您的幫助,但我仍然你的SQL語句不處理正確的投票的總和,我改變你的左加入流到加入流獲取流信息,這是最重要的,但仍然,所有票的總和錯了...... – Pontus 2011-05-14 14:25:27

+0

@Pontus - 好吧,我想我們可以解決它。 SUM以何種方式錯誤?正如我所提到的,您可能想要調整的另一件事是GROUP BY聲明 - 您希望獲得的票數是多少?每個事件?每個用戶和流量?每個用戶和流量和事件?我有一種感覺,整理分組會得到你想要的。 – Galz 2011-05-14 15:05:08

+0

好吧,事情是,投票存儲在flow__has__vote和通過user_id,flow_id和點,所以在我的腦海裏,你需要做的一切就是SUM(或實際上是COUNT)每個flow_id的帖子... – Pontus 2011-05-14 15:26:41