2008-12-16 7 views
0

Un doute dans MSSQL. Il existe deux tables dans une base de données.Sql Lier deux tables

Tableau 1, dénommé logement contient champs PRPT_Id (int), PRPT_Name (varchar), PRPT_Status (bit)

Tableau 2 nommé PropertyImages contiennent des champs PIMG_Id (int), PIMG_ImageName (varchar), PRPT_Id (int), PIMG_Status (bit)

Ces deux tables suivent une relation un-à-plusieurs. Cela signifie que chaque Propriété peut avoir zéro, une ou plusieurs PropertyImages correspondantes.

Ce qui est nécessaire est une requête pour afficher

PRPT_Id, PRPT_Name, nombre d'image (Comte de toutes les images correspondant à un PRPT_Id où PIMG_Status est vrai. O s'il arent des images), FirstImageName (s'il y a n images , le nom de la première image dans la table d'image correspondant au PRPT_Id avec PIMG_Status vrai. s'il n'y a pas d'images, nous remplissons cela avec des espaces/blanc). une autre condition est que PRPT_Status soit vrai. Editer Remarque - Les deux tables ont des entiers auto-incrémentés comme clé primaire. Donc, le premier nom d'image sera le nom avec MIN (PIMG_Id), n'est-ce pas?

Je veux que le PIMG_ImageName correspondant au MIN (PIMG_ID) dans le resultset

+0

Qu'est-ce que la "première" image? Image avec PIMG_Id minimal? –

+0

na juste l'image venant en premier dans la table. mais il aura aussi PIMG_Id minime puisque le PIMG_Id est auto incrémenté – naveen

+0

Ceci est un doublon de http://stackoverflow.com/questions/268107/mysql-cross-table-count-query-help#268118 – Dheer

Répondre

2

En supposant que firstImage signifie celui qui a le plus bas Id, alors ce doit être au moins suffisamment proche pour tester jusqu'à la fin:

SELECT
PRPT_Id,
PRPT_Name,
ISNULL (pi1.ImageName , '') AS FirstImageName,
COUNT (1) AS

nombre d'image à partir de la propriété en tant que p

LEFT JOIN PropertyImages AS pi
SUR p.PRPT_Id = pi.PRPT_Id

LEFT JOIN PropertyImage AS EP1
SUR p.PRPT_Id = pi1.PRPT_Id

LEFT JOIN PropertyImgage AS EP2
p. PRPT_Id = pi2.PRPT_Id
ET pi1.PIMG_Id> pi2.PIMG_Id

OÙ PRPT_Status = TRUE
ET pi1.PIMG_Status = TRUE
ET pi2.PIMG_ImageName IS NULL

Le double LEFT JOIN assure que vous obtenez le premier enregistrement d'image dans EP1. Si la règle "Premier" est différente, ajustez cette jointure en conséquence.

Cela devrait être à peu près aussi efficace que possible. Il n'a pas de sous-requêtes.

2

Il semble que vous devez écrire des requêtes imbriquées pour afficher ce que vous voulez.

Si c'est le cas (je ne suis pas un expert SQL), je vous recommande de commencer par la requête la plus interne, puis vous sortez jusqu'à ce que vous atteigniez la requête la plus externe (et finale). D'abord, vous devez récupérer les PIMG et les regrouper par PRPT.

SELECT PRPT_Id, COUNT(PIMG_Id) AS PRPT_ImageCount, MIN(PIMG_Id) AS PRPT_MinImage 
FROM PropertyImages 
GROUP BY PRPT_Id 

Ceci récupère les PRPT_Id des propriétés qui ont des images associées. Cependant, vous n'obtenez aucun résultat pour les propriétés qui n'ont aucune image associée. Après cela, nous allons quitter la table Properties avec la requête précédente. La jointure à gauche garantit que toutes les propriétés seront récupérées, même si elles n'apparaissent pas dans les résultats de la bonne requête (c'est-à-dire, même si elles n'ont pas d'images associées).

SELECT Properties.*, PRPT_ImageCount, PRPT_MinImage 
FROM Properties LEFT JOIN (
SELECT PRPT_Id, COUNT(PIMG_Id) AS PRPT_ImageCount, MIN(PIMG_Id) AS PRPT_MinImage 
FROM PropertyImages 
GROUP BY PRPT_Id) Temp ON (Properties.PRPT_Id = Temp.PRPT_Id) 

J'espère que mon SQL n'est pas faux et que cet article vous aide.

Cordialement,


Edit:

SELECT Properties.*, 
     PRPT_ImageCount, 
     PRPT_MinImage, 
     PIMG_ImageName 
FROM (Properties LEFT JOIN 
     (SELECT PRPT_Id, 
       COUNT(PIMG_Id) AS PRPT_ImageCount, 
       MIN(PIMG_Id) AS PRPT_MinImage 
     FROM PropertyImages 
     GROUP BY PRPT_Id) Temp1 
     ON (Properties.PRPT_Id = Temp1.PRPT_Id)) Temp2 LEFT JOIN 
    PropertyImages ON (PropertyImages.PIMG_Id = Temp2.PRPT_MinImage) 

Maintenant, je suis vraiment pas sûr de mon SQL.

+0

cette requête bascule ... mais je veux que le nom de l'image ne soit pas id dans le jeu de résultats – naveen

+0

J'ai modifié la requête afin que vous puissiez obtenir le nom de l'image et pas seulement l'identifiant. –

0

le nom de la première image dans la table d'image correspondant à la PRPT_Id avec PIMG_Status vrai

Vous pouvez définir « première » dans ce contexte.Les tables ne sont pas vraiment ordonnées, à moins que vous ne gardiez votre propre commande, le terme doit d'abord signifier "premier trouvé".

En supposant que ce qui précède est vrai (vous voulez la première image trouvée), alors c'est la seule vraie partie difficile de la requête (et le type de chose qui m'a fait trébucher avant). Le reste semble assez simple. Si je peux trouver l'heure demain, je vais essayer de mettre quelque chose ensemble pour vous ... mais il semble que quelqu'un d'autre sera capable de fournir la réponse avant.