所以我有一个关于LEFT JOIN的问题,这段代码根据用户是否得到这个组返回不同的值,即totalPoints的值。(如果用户没有获得组或事件,则返回正确的值)
我只想了解如何让flow_has_vote离开flow_has_vote.flow_id=flows.id上的JOIN 每次工作。我以前用三个查询解决了问题,一个是获取组和事件规则,一个是检查用户是否得到了考虑到安全性的组或事件,还有一个是为了获得流.
我想我可以通过有两个查询来解决这个问题,一个是获取组和事件规则,另一个是检查用户是否得到组和事件,然后根据用户的不同获得流应该有访问权限。
现在,我在一个查询中获取所需的所有信息,然后用IF语句检查是否应该打印它.
所以,我的问题是,是否可以让SUM(flow_has_vote.points)作为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
发布于 2011-05-14 12:13:26
因此,最基本的要点(IMHO)不是在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?)将列添加到组中。
另外,您可能希望将一些LEFT JOINs转换为JOIN,因此您将只获得具有“flow”的用户。
https://stackoverflow.com/questions/6001038
复制相似问题