Selection de personnes de sexe identique et d'age proche
1 réponse
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
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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 ! :-)
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:brouardf@club-internet.fr ******************
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 ?
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 ?