Page 1 sur 1

Récupérer la première photo d'une annonce

Posté : 26 mars 2009, 19:19
par VaN
Bonjour,

via une requête, je fais un listing d'annonces enregistrées dans la base. Et j'aimerais également récupérer une photo liée à cette annonce, et plus précisément celle dont le champ photo_position est le plus petit.

Voici les 2 tables en question :

Code : Tout sélectionner

CREATE TABLE `annonces` ( `annonce_id` int(11) NOT NULL auto_increment, `annonce_user_id` int(11) NOT NULL PRIMARY KEY (`annonce_id`), ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=530 ; CREATE TABLE `photos` ( `photo_id` int(11) NOT NULL auto_increment, `photo_annonce_id` int(11) NOT NULL, `photo_datetime` datetime NOT NULL, `photo_main` tinyint(4) NOT NULL, `photo_position` tinyint(4) NOT NULL, PRIMARY KEY (`photo_id`), KEY `photo_annonce_id` (`photo_annonce_id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1097 ;
Et voici la reqête via laquelle j'essaie de récupérer les annonces :
$sql = "SELECT annonce_id, annonce_price, annonce_description, annonce_old_price, photo_id, annonce_type_bien, annonce_rooms, annonce_zipcode, annonce_city, 
annonce_surface, annonce_vendu
		FROM ".$cfg_prefixe."annonces 
		LEFT JOIN ".$cfg_prefixe."photos ON (photo_annonce_id = annonce_id)
		WHERE annonce_statut = 3";
Ce que je voudrais ajouter, c'est quelque chose du genre

Code : Tout sélectionner

ORDER BY photo_position LIMIT 1
dans la requête, mais au moment de récupérer la photo.

Comment puis-je faire ?

Posté : 26 mars 2009, 23:43
par furiouslol
Ce que je voudrais ajouter, c'est quelque chose du genre
Code:
ORDER BY photo_position LIMIT 1
dans la requête, mais au moment de récupérer la photo.
Salut qu'entend tu par la ?

Posté : 27 mars 2009, 11:55
par VaN
En gros je voudrais pouvoir fusionner ces 2 requêtes en une seule :

Code : Tout sélectionner

SELECT annonce_id, annonce_price, annonce_description FROM annonces
foreach($annonces as $key => $annonce) {
$annonces[$i]["photo_id"] = getValueFromQuery(sprintf("SELECT photo_id FROM ".$cfg_prefixe."photos WHERE photo_annonce_id = '%d' 
					ORDER BY photo_position LIMIT 1", $annonce["annonce_id"]));
}

Posté : 28 mars 2009, 02:27
par Sékiltoyai
Il faut que tu utilises une sous-requête :

Code : Tout sélectionner

SELECT machin, p.photo FROM table, (SELECT photo FROM table LIMIT 1) as p;

Posté : 28 mars 2009, 09:14
par furiouslol
J'ai essayé ce genre de requête

Code : Tout sélectionner

SELECT a.annonce_id, p2.* FROM annonces a, ( SELECT p2.* FROM photos p2 WHERE p2.photo_annonce_id = a.annonce_id ORDER BY p2.photo_position LIMIT 1) as p2;
Mais la requete ne reconnait pas la jointure dans la sous requête

Sinon y a la sous requete dans le SELECT

Code : Tout sélectionner

SELECT a.annonce_id, ( SELECT p2.photo_position FROM photos p2 WHERE p2.photo_annonce_id = a.annonce_id ORDER BY p2.photo_position LIMIT 1) as POSITION FROM annonces a;
Mais ca implique une seule valeur par sous requete, donc autant de sous requete que de champs que tu veux sortir de la table photos

J'ai une forte impression de rater un truc simple :lol:

Posté : 28 mars 2009, 09:32
par furiouslol
mmm ca marcherait pas ça par exemple ? (sous requête en condition dans le where)

Code : Tout sélectionner

SELECT a.annonce_id, p. * FROM annonces a, photos p WHERE p.photo_position = ( SELECT MAX( p2.photo_position ) FROM photos p2 WHERE p2.photo_annonce_id = a.annonce_id GROUP BY p2.photo_annonce_id )