2010-05-07 1 views
1

Можно ли выполнить этот запрос без подзапросов?Подзапросы MySQL

SELECT login, post_n, 

(SELECT SUM(vote) FROM votes WHERE votes.post_n=posts.post_n)AS votes, 
(SELECT COUNT(comments.post_n) FROM comments WHERE comments.post_n=posts.post_n)AS comments_count 

FROM users, posts 
WHERE posts.id=users.id AND (visibility=2 OR visibility=3) 
ORDER BY date DESC LIMIT 0, 15 

столы:

пользователей: ID, логин

сообщения: post_n, идентификатор, видимость

Голосов: post_n, голосовать

ID - идентификатор пользователя `s, Пользователи - главная таблица.

+0

, из которого таблица видимости принадлежит? –

+0

Я ответил в столбце минуту – swamprunner7

ответ

0

вы можете хранить количество голосов и столбцов в таблице «пользователей» и обновлять их с помощью триггера или запроса «обновления».

+0

Я испытаю его, спасибо – swamprunner7

2

Да, это возможно:

SELECT login, post_n, 

SUM(vote) as votes, 

FROM users 
JOIN posts using(id) 
LEFT JOIN votes using(post_n) 
WHERE visibility=2 OR visibility=3 
GROUP BY login, post_n 

Затем расплющить результат:

select * from 
(
    SELECT login, post_n, 

    SUM(vote) as votes, 

    FROM users 
    LEFT JOIN posts using(id) 
    LEFT JOIN votes using(post_n) 
    WHERE visibility=2 OR visibility=3 
    GROUP BY login, post_n 
) as votes_count 

Тогда присоединиться комментарии:

select votes_count.login, votes_count.post_n, votes_count.votes, 

    COUNT(comments.post_n) as comments_count 

from 
(
    SELECT login, post_n, 

    SUM(vote) as votes, 

    FROM users 
    LEFT JOIN posts using(id) 
    LEFT JOIN votes using(post_n) 
    WHERE visibility=2 OR visibility=3 
    GROUP BY login, post_n 
) as votes_count 
LEFT JOIN comments using(post_n) 
GROUP BY votes_count.login, votes_count.post_n 
ORDER BY date DESC LIMIT 0, 15 
+0

Это не похоже, что у него есть подзапросы, но он есть. см. http://dev.mysql.com/doc/refman/5.0/en/explain.html –

+1

это не подзапрос (где запрос pingpong взад и вперед по 3 таблицам). это называется выводом таблицы, получение таблицы более эффективно. но вывод таблицы более изящный, если MySQL уже имеет CTE –

+0

@Maksim: попытайтесь различить разницу между выводом таблицы (эффективным) и подзапросом (неэффективным) –

0

У меня есть тест оба варианта и тестовый вариант, когда мы используя объединение или где объединить наши таблицы.

Нет подзапросов, более медленных, 0,0208 сек и mysql использовать только 271 строку в таблице голосов, но когда у меня есть соединения, используйте целые строки. Здесь нет подзапросов варианта:

SELECT res.*, COUNT(*) FROM 
(
    SELECT login, posts.post_n, SUM(vote)AS votes 
    FROM users, posts, votes 
    WHERE users.id=posts.id AND posts.post_n=votes.post_n AND visibility=3 
    GROUP BY posts.post_n 
)AS res, comments 
WHERE comments.post_n=res.post_n 
GROUP BY res.post_n 
ORDER BY date DESC 
LIMIT 0, 15 

И подзапросы Varian выполняются только 0,0027 сек, не `ы не кэша, но с использованием индексов во всех тестах.

p.s. извините за мой английский

 Смежные вопросы

  • Нет связанных вопросов^_^