Выполнение многостолового внутреннего / левого / правого соединения (или коррелированного подзапроса) с количеством? - PullRequest
1 голос
/ 14 сентября 2011

Мне интересно, как именно выполнить трехстороннее соединение, используя следующую структуру (значительно упрощенную)

**Table 1:**
vote.id
vote.item_id

**Table 2:**
item.id
item.owner_id

**Table 3**
owner.id

Моя цель здесь - в основном подсчитать количество голосов, которые имеет «владелец». Я продолжаю думать, что я могу просто сделать это, используя коррелированный подзапрос, но кажется, что это было бы повышением производительности, если бы голоса были огромными? Может я не прав? Я просто не могу обойти 3 (или более) стола, как это. Возможно ли сделать это за 1 запрос, а не за 2 шага?

е

SELECT owner.id, 
   (SELECT count(SELECT count(vote.id) as Cnt WHERE vote.item_id = item.id) as ItemCnt
   WHERE item.owner_id = owner.id) as TotalCnt 
WHERE owner.id = :id

Будет ли что-то подобное даже работать? Есть ли лучший, более эффективный способ сделать это?

Любая помощь или совет, как всегда, очень ценятся

1 Ответ

3 голосов
/ 14 сентября 2011

Все так просто:

select count(vote.id)
from owner
left join item on (item.owner_id = owner.id)
left join vote on (vote.item_id = item.id)
where owner.id = :id
...