2012-06-12 3 views
2

У меня есть эти две таблицы:COUNT и SELECT, запрос из двух таблиц

1. users 
    -id 
    -name 
    -email 
    -rank 

2. pages 
    -user 
    -id 

Мне нужно, чтобы выбрать все данные от пользователей и подсчитать, сколько страниц сделал он написал (со страниц пользователя является идентификатором пользователя из таблицы пользователей).

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

+4

Все ответы ниже использовать внутренние соединения, но я предлагаю 'ЛЕВЫЙ JOIN', поэтому вы получаете 0 для пользователей без страниц, а не без записи. –

+0

Слишком много хороших ответов: D – Aelios

ответ

2

Я могу» т превратить его в сложный запрос, но вот простой:

SELECT u.name, u.email, u.rank, u.id, count(p.id) as 'PageCount' 
FROM Users u 
JOIN Pages p ON 
    p.id = u.id 
GROUP BY u.name, u.email, u.rank, u.id 
+0

Эй, спасибо за ваш ответ. Теперь я добавил еще одну таблицу для комментариев, как я могу улучшить ваш запрос, чтобы также показать количество комментариев Пользователь? (таблица комментариев точно соответствует страницам). –

+1

Чтобы сделать это в том же запросе, я просто добавлю еще один «JOIN» в таблицу комментариев: «JOIN Комментарий c ON c.id = u.id' - _but_, как @ Майкл говорит в своем комментарии к вашему вопросу, d теперь используйте 'LEFT OUTER JOIN', чтобы вы возвращали записи для всех пользователей. Если вы этого не сделаете, вы увидите только тех, кто написал страницу * и * комментарий. – Widor

+0

@Widor, любезно позвольте мне прояснить себя: будет ли запрос выдавать правильный результат (логически), если два пользователя имеют одинаковое имя? – manurajhada

0

Да, сделать это следующим образом:

select u.id, u.name, u.email, u.rank, count(p.id) as 'counter' from users u 
inner join pages p on p.user = u.id 
group by u.id, u.name, u.email, u.rank 

вас группу по информации пользователей и вычислить (количество) количество страниц для каждого пользователя.

0

Как насчет этого.

select u.id, count(p.id) as 'number_of_pages_wrote' 
from  users u inner join pages p 
on  u.id = p.id 
group by u.id; 
-1

Это может быть сделано с помощью JOIN.

Например,

SELECT * FROM pages 
INNER JOIN users ON (users.id=pages.user) 
WHERE users.id=5 

подберет все страницы идентификатора пользователя 5. Я дам вам сделать все остальное, чтобы включить агрегатную функцию;)

0
select users.id, users.name,users.email,users.rank, count(pages.id) 
from  users,pages 
where users.id = pages.user 
group by users.id 
0

Вы можете сделать это следующим образом -

SELECT u.*, p.count 
FROM users u, 
    (SELECT pa.id, count(1) FROM pages pa WHERE pa.id = u.id) p 
WHERE u.id = p.id 
3
select u.*,count(p.*) from users u left join pages p on u.id=p.user group by u.id; 
+0

Что такое u и p? –

+3

@DanBarzilay Пожалуйста, передумайте изучение 'SQL' правильно, u и p - псевдонимы для таблицы. –

+0

Так почему же здесь есть 'users' и' u' здесь: 'от пользователей u left' –

0

Что об этом простом запросе

SELECT user, COUNT(*) AS pages FROM page GROUP BY user 
Смежные вопросы