我的一个LEFT JOIN和SUM的结果出现了问题

时间:2011-05-14 09:50:52

标签: mysql optimization sum left-join

所以我对 LEFT JOIN 提出了一个问题,此代码会为 totalPoints 返回不同的值,具体取决于用户是否获得了该组。 (如果用户没有得到组或事件,则返回正确的值)

我只想了解如何获得 LEFT JOIN flow_ _vote ON flow_ _vote.flow_id = flows.id 上班每次。我之前用三个查询做了一个解决方案,一个获取组和事件规则,一个用于检查用户是否获得了考虑安全性的组或事件,另一个用于获取流程...

我想我可以通过两个查询解决这个问题,一个获取组和事件规则,还检查用户是否获得了组和事件,然后根据用户获得流量的查询访问它。

现在,我正在获取一个查询中所需的所有信息,然后使用IF语句检查是否应该打印...

所以,我的问题是,是否可以通过这种方式获得 SUM(flow_ has _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语句在做什么,获取流(post)的信息,流的信息和流的组,检查用户对组和事件的访问权限,以及获取所有投票的流程......

这就是表格的样子......

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            | 
+--------+----------+-------------+--------+--------+---------+---------+-----+-----+--------------+--------------+

还有一个例子......

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

享受生活~Pontus

1 个答案:

答案 0 :(得分:0)

因此,基本上主要观点(恕我直言)不包括LEFT JOINed子句中WHERE的表格条件,因为这会使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添加列?{/ p>

此外,您可能希望将部分LEFT JOINs转为JOIN,因此您只会获得拥有“流量”的用户。