OVH Cloud OVH Cloud

Selection de personnes de sexe identique et d'age proche

1 réponse
Avatar
Bruno Baguette
Bonjour,

Je cherchais à afficher les 10 personnes qui étaient le plus
similaire à une personne précise. Les critères étant les personnes
du même sexe et dont l'âge se rapproche de l'age de cette personne.
Les personnes ne possédant pas de photos sont écartées.

Voici donc la table (en faisant abstraction des champs qui ne
concernent pas cette requête) :
personnes (idpersonne,sexe,date_naissance,photovisagemini_url) où
idpersonne est évidemment une clef primaire qui est remplie par
une séquence.

Et la requête que j'ai faite :

SELECT idpersonne, photovisagemini_url
FROM personnes
WHERE photovisagemini_url IS NOT NULL
AND char_length(trim(BOTH ' ' FROM photovisagemini_url))>0
AND personnes.sexe IN (SELECT sexe FROM personnes WHERE idpersonne
= 250::int8)
AND personnes.idpersonne != 250::int8
ORDER BY abs(personnes.date_naissance - (SELECT date_naissance FROM
personnes WHERE idpersonne = 250::int8)) ASC
LIMIT 10;

Je précise que je travaille avec PostgreSQL 7.3.4

Cette requête fonctionne bien, mais je me demandais si personne n'aurait
une suggestion d'une manière plus performante de faire cette requête ?

D'avance merci ! :-)

--
----------------------------------------
Bruno Baguette - bouchon@alussinan.org

1 réponse

Avatar
Fred BROUARD - SQLpro
pourquoi ne pas faire tout simplement une jointure ?

du style :

SELECT ..., ABS(P.AGE - P1.AGE)

FROM PERSONNES P
INNER JOIN PERSONNE P1
ON P.idpersonne <> P1.idpersonne
AND P.sexe = P1.sexe
WHERE ...

ORDER BY ABS(P.AGE - P1.AGE)
LIMIT 10

A +


--
Frédéric BROUARD - expert SQL, spécialiste : SQL Server / Delphi / web
Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
****************** mailto: ******************
Bruno Baguette a écrit:
Bonjour,

Je cherchais à afficher les 10 personnes qui étaient le plus
similaire à une personne précise. Les critères étant les personnes
du même sexe et dont l'âge se rapproche de l'age de cette personne.
Les personnes ne possédant pas de photos sont écartées.

Voici donc la table (en faisant abstraction des champs qui ne
concernent pas cette requête) :
personnes (idpersonne,sexe,date_naissance,photovisagemini_url) où
idpersonne est évidemment une clef primaire qui est remplie par
une séquence.

Et la requête que j'ai faite :

SELECT idpersonne, photovisagemini_url
FROM personnes
WHERE photovisagemini_url IS NOT NULL
AND char_length(trim(BOTH ' ' FROM photovisagemini_url))>0
AND personnes.sexe IN (SELECT sexe FROM personnes WHERE idpersonne
= 250::int8)
AND personnes.idpersonne != 250::int8
ORDER BY abs(personnes.date_naissance - (SELECT date_naissance FROM
personnes WHERE idpersonne = 250::int8)) ASC
LIMIT 10;

Je précise que je travaille avec PostgreSQL 7.3.4

Cette requête fonctionne bien, mais je me demandais si personne n'aurait
une suggestion d'une manière plus performante de faire cette requête ?

D'avance merci ! :-)