2010-03-30 6 views
2

Je travaille sur un petit type de système de journal à une page Web, et j'ai quelques difficultés avec une requête que je veux faire plusieurs choses. J'ai essayé de faire des sous-requêtes imbriquées, mais je n'arrive pas à faire les choses correctement.Aide avec la requête SQL (liste des chaînes et compte dans la même requête)

J'ai deux tables:

User = {userid: int, username} 

Registered = {userid: int, favoriteid: int} 

Ce que je besoin est une requête pour répertorier tous les de code d'utilisateur et les noms d'utilisateur de chaque utilisateur. En outre, j'ai également besoin de compter le nombre total de favorisid l'utilisateur est enregistré avec.

Un utilisateur qui n'est enregistré pour aucun favori doit également être répertorié, mais avec le nombre de favoris affiché comme zéro.

J'espère que j'ai expliqué ma demande probablement mais sinon écrivez s'il vous plaît pour que je puisse élaborer.

Par ailleurs, la requête que je l'ai essayé avec ressembler à ceci:

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

Cependant, il ne fait pas l'affaire, malheureusement

Amitiés Mestika

Répondre

1

Essayez quelque chose comme ça (non testé)

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 

Soit dit en passant, c'est la syntaxe SQL Server. La syntaxe de MySQL serait très similaire, il suffit d'échanger la fonction ISNULL avec IFNULL. S'il s'agit d'un autre SGBD, cela devrait au moins vous donner une idée. Selon OMG Ponies, COALESCE pourrait être utilisé à la place de ISNULL pour le faire fonctionner sur SQL Server/MySQL/Oracle/etc. J'ai vérifié cela sur SQL Server.

Pour plus d'informations sur les fonctions null, voir ici: http://www.w3schools.com/SQL/sql_isnull.asp

+1

Échangez 'ISNULL' pour' COALESCE', et vous avez une requête qui fonctionnera sur Oracle, SQL Server, MySQL, Postgres ... :) –

+0

Bon appel. Et j'ai testé ma déclaration contre une base de données de test juste pour être sûr que je n'ai pas conduit n'importe qui dans le mauvais sens. –

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

Si favoriId peut être nul, alors utiliser

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

Merci beaucoup Thomas, ça fonctionne comme un charme et une réponse vraiment rapide . Merci encore :-) – Mestika

0

SELECT user.userid, user.username, compter (favoriteid) DE l'utilisateur, enregistré OU user.userid = registered.userid gorupby utilisateur. userid, user.username UNION SELECT user.userid, user.username, 0 FROM user oÙ user.userid PAS EXISITS (sélectionner 1 à partir enregistré où registered.userid = user.userid)