首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >与我的一个左联接的问题,并总结其结果

与我的一个左联接的问题,并总结其结果
EN

Stack Overflow用户
提问于 2011-05-14 09:50:52
回答 1查看 149关注 0票数 0

所以我有一个关于LEFT JOIN的问题,这段代码根据用户是否得到这个组返回不同的值,即totalPoints的值。(如果用户没有获得组或事件,则返回正确的值)

我只想了解如何让flow_has_vote离开flow_has_vote.flow_id=flows.id上的JOIN 每次工作。我以前用三个查询解决了问题,一个是获取组和事件规则,一个是检查用户是否得到了考虑到安全性的组或事件,还有一个是为了获得流.

我想我可以通过有两个查询来解决这个问题,一个是获取组和事件规则,另一个是检查用户是否得到组和事件,然后根据用户的不同获得流应该有访问权限。

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

所以,我的问题是,是否可以让SUM(flow_has_vote.points)作为totalPoints以这种方式工作?你知道怎么做吗?

另外,我有点好奇,一个查询是处理这个问题的最好方法吗?当考虑到性能时,使用两种方法是否合理?

代码语言:javascript
复制
 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)的信息,流所在的事件和组的信息,检查用户对组和事件的访问,并获得流的所有选票.

这是桌子的样子..。

代码语言:javascript
复制
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

这是我希望的结果..。

代码语言:javascript
复制
+--------+----------+-------------+--------+--------+---------+---------+-----+-----+--------------+--------------+
| flowId | security | totalPoints | userId | alias  | eventId | groupId | eMR | gMR | userHasGroup | userHasEvent | 
+--------+----------+-------------+--------+--------+---------+---------+-----+-----+--------------+--------------+
|      1 | 2        | 1337        | 5      | Pontus | 15      | 2       | 2   | 2   | 4            | 4            | 
+--------+----------+-------------+--------+--------+---------+---------+-----+-----+--------------+--------------+

还有一个例子..。

代码语言:javascript
复制
+--------+----------+-------------+--------+--------+---------+---------+-----+-----+--------------+--------------+
| flowId | security | totalPoints | userId | alias  | eventId | groupId | eMR | gMR | userHasGroup | userHasEvent | 
+--------+----------+-------------+--------+--------+---------+---------+-----+-----+--------------+--------------+
|      1 | 2        | 1337        | 6      | Kezia  | 15      | 2       | 2   | 2   | null         | null         | 
+--------+----------+-------------+--------+--------+---------+---------+-----+-----+--------------+--------------+

享受你的生活~ Pontus

EN

回答 1

Stack Overflow用户

发布于 2011-05-14 12:13:26

因此,最基本的要点(IMHO)不是在LEFT JOINedWHERE子句中包含表的条件,因为这使得LEFT JOIN的行为类似于INNER JOIN

从尝试这个查询开始(虽然我确信您将不得不进行调整,因为我不确定您最终想要的是什么,稍后会有更多的信息):

代码语言:javascript
复制
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,因此您将只获得具有“flow”的用户。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6001038

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档