Проблема с одним из моих LEFT JOIN и SUM результат этого - PullRequest
0 голосов
/ 14 мая 2011

Итак, я получил вопрос о LEFT JOIN , этот код возвращает различные значения для totalPoints в зависимости от того, получил пользователь группу или нет. (если пользователь не получил группу или событие, он возвращает правильное значение)

Я просто хочу понять, как заставить 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-оператор, получая информацию о потоке (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 голосов
/ 14 мая 2011

Таким образом, по сути, главное (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, поэтомунапример, вы получите только тех пользователей, у которых есть «поток».

...