Помощь с запросом SQL (список строк и количество в одном запросе) - PullRequest
2 голосов
/ 30 марта 2010

Я работаю над небольшой системой журналов для веб-страницы, и у меня возникли некоторые трудности с запросом. Я хочу сделать несколько вещей. Я пытался выполнить несколько вложенных / подзапросов, но, похоже, не могу сделать это правильно.

У меня есть две таблицы:

User = {userid: int, username}

Registered =  {userid: int, favoriteid: int}

Мне нужен запрос для перечисления всех идентификаторов пользователей и имен пользователей. Кроме того, мне также нужно подсчитать общее количество избранных, в которых зарегистрирован пользователь.

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

Я надеюсь, что я объяснил свой запрос, но в противном случае, пожалуйста, напишите мне, чтобы я мог уточнить.

Кстати, запрос, который я пробовал, выглядит так:

SELECT user.userid, user.username FROM user,registered WHERE user.userid = registered.userid(SELECT COUNT(favoriteid) FROM registered)

Однако, к сожалению, это не помогает,

С уважением Mestika

Ответы [ 3 ]

1 голос
/ 30 марта 2010

Попробуйте что-то вроде этого (не проверено)

Select u.userid, username, ISNULL(x.FavoriteCount, 0) as FavoriteCount
From User u 
Left Join
(Select userid, count(*) as FavoriteCount
From Registered
Group By userid) x
on u.userid = x.userid

Кстати, это синтаксис SQL Server. Синтаксис MySql был бы очень похож, просто поменяйте местами функцию ISNULL с IFNULL. Если это другая СУБД, то она должна хотя бы дать вам представление.

Редактировать: Согласно OMG Ponies, COALESCE можно использовать вместо ISNULL, чтобы заставить его работать в SQL Server / MySQL / Oracle / и т.д. Я подтвердил это на SQL Server.

Подробнее о нулевых функциях см. Здесь: http://www.w3schools.com/SQL/sql_isnull.asp

0 голосов
/ 30 марта 2010

ВЫБЕРИТЕ user.userid, user.username, count (favourid) ОТ пользователя, зарегистрированного ГДЕ user.userid = зарегистрирован. gorupby user.userid, user.username UNION ВЫБЕРИТЕ user.userid, user.username, 0 ОТ пользователя ГДЕ user.userid НЕ СУЩЕСТВУЕТ (выберите 1 из зарегистрированных, где зарегистрированный.userid = user.userid)

0 голосов
/ 30 марта 2010
Select userid, username
    , ( Select Count(*) From Registered As R Where R.userid = U.userid ) As RegistrationCount
From User As U

Если значение FavoritesId может быть обнуляемым, используйте

Select userid, username
    , ( Select Count(favoriteid) From Registered As R Where R.userid = U.userid ) As RegistrationCount
From User As U
...