2011-08-31 4 views
1

Je cherche un moyen dans mySQL pour sélectionner uniquement les enregistrements qui ont des enregistrements correspondants dans une table liée. Je souffre probablement d'une vision en tunnel, ou manque quelque chose de simple.Sélectionnez uniquement les enregistrements avec des enregistrements liés

je la requête suivante qui travaille actuellement en plus de cette exigence ci-dessus:

SELECT P.ID, P.NAME, P.SEO_NAME, CI.City, R.Region, C.Country 
FROM PROPERTIES P 
LEFT JOIN Cities CI ON P.CITY_ID = CI.CityId 
LEFT JOIN Regions R ON P.REGION_ID = R.RegionID 
LEFT JOIN Countries C ON P.COUNTRY_ID = C.CountryId 
WHERE APPROVED = '1' AND REGION_ID = '5400' 
ORDER BY RAND() LIMIT 1; 

Ceci est lié à une question précédente de moi, ici: Select rows Having Count in linked table

Alors que la réponse dans ce fil lié a travaillé pour moi à l'époque, j'ai maintenant besoin des informations supplémentaires dans la requête ci-dessus. Est-il possible que je peux limiter pour que seuls les enregistrements avec les enregistrements de la table liée PROPERTY_PHOTOS PP (qui relie ON P.ID = PP.PROPERTY_ID)

Merci à l'avance pour toute entrée.

+0

Vous ne liez pas la table PROPERTY_PHOTOS. Si vous mettez à jour votre requête, je vais corriger ma réponse. – MattBelanger

+0

Merci à tous pour avoir signalé l'éléphant que je ne voyais pas. Il h. – DaveL

Répondre

1

Un plus JOIN, mais pas LEFT

SELECT ... 
FROM PROPERTIES P 
... 
INNER JOIN PROPERTY_PHOTOS PP ON P.ID = PP.PROPERTY_ID 

ou tout simplement

SELECT ... 
FROM PROPERTIES P 
... 
JOIN PROPERTY_PHOTOS PP ON P.ID = PP.PROPERTY_ID 

parce que they are the same. Essayez d'utiliser INNER JOIN à la place de LEFT JOIN.

+0

À quoi cela sert-il? Premier commentaire sur ma réponse que ce n'est pas correct, puis poster exactement la même chose? –

+0

abatischev était en fait la première réponse que j'ai essayé, et cela a immédiatement fonctionné. Bien sûr, c'est aussi simple. Je regardais juste ceci d'une manière entièrement différente. Je vous remercie. – DaveL

-1

Note: Cette requête ne comprend pas vraiment une table de photos, mais je suppose que vous adhérez comme PP

SELECT P.ID, P.NAME, P.SEO_NAME, CI.City, R.Region, C.Country 
FROM PROPERTIES P 
LEFT JOIN Cities CI ON P.CITY_ID = CI.CityId 
LEFT JOIN Regions R ON P.REGION_ID = R.RegionID 
LEFT JOIN Countries C ON P.COUNTRY_ID = C.CountryId 
WHERE APPROVED = '1' AND REGION_ID = '5400' AND PP.PROPERTY_ID IS NOT NULL 
ORDER BY RAND() LIMIT 1; 
4

Selon les spécifications SQL pour INNER JOIN:

The INNER JOIN keyword return rows when there is at least one match in both tables. 

Pour le LEFT JOIN, cela devient:

The LEFT JOIN keyword returns all rows from the left table (table_name1), 
even if there are no matches in the right table (table_name2). 
+0

@abatishchev: Et c'est exactement ce que fait INNER JOIN: exclure les liens manquants –

+0

Désolé, j'ai mal lu. – abatishchev

3
SELECT P.ID, P.NAME, P.SEO_NAME, CI.City, R.Region, C.Country 
FROM PROPERTIES P 
LEFT JOIN Cities CI ON P.CITY_ID = CI.CityId 
LEFT JOIN Regions R ON P.REGION_ID = R.RegionID 
LEFT JOIN Countries C ON P.COUNTRY_ID = C.CountryId 
**INNER JOIN PROPERTY_PHOTOS PP ON P.ID = PP.PROPERTY_ID** 
WHERE APPROVED = '1' AND REGION_ID = '5400' 
ORDER BY RAND() LIMIT 1; 
4

Un INNER JOIN devrait le faire pour vous:

INNER JOIN PROPERTY_PHOTOS PP ON P.ID = PP.PROPERTY_ID 

Cette volonté ne renvoyer les enregistrements que s'il y a correspondance les deux tables.

3

Vous aurez besoin d'un "INNER JOIN".

Questions connexes