2011-05-14 73 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