MySQL подзапросы - PullRequest
       7

MySQL подзапросы

1 голос
/ 07 мая 2010

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

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, id, visibility

Голосов: post_n, голосование

id - это идентификатор пользователя, пользователи главной таблицы.

Ответы [ 3 ]

2 голосов
/ 07 мая 2010

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

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 голосов
/ 08 мая 2010

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

Нет варианта подзапросов более медленного, 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 сек, кеша нет, но индексы используются во всех тестах.

ps извините за мой английский

0 голосов
/ 07 мая 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...