2009-06-12 8 views
0

J'ai besoin d'aide pour formuler cette requête. J'ai deux tables (pertinentes), que je videra ici pour référence:Requête MySQL: Obtenir toutes les pochettes d'album

CREATE TABLE IF NOT EXISTS `albums` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `user_id` int(11) NOT NULL COMMENT 'owns all photos in album', 
    `parent_id` int(11) DEFAULT NULL, 
    `left_val` int(11) NOT NULL, 
    `right_val` int(11) NOT NULL, 
    `name` varchar(80) COLLATE utf8_unicode_ci NOT NULL, 
    `num_photos` int(11) NOT NULL, 
    `date_created` int(11) NOT NULL, 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `parent_id` (`parent_id`,`name`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=3 ; 

CREATE TABLE IF NOT EXISTS `photos` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `album_id` int(11) NOT NULL, 
    `filename` varchar(32) COLLATE utf8_unicode_ci NOT NULL, 
    `num_views` int(11) NOT NULL DEFAULT '0', 
    `date_uploaded` int(11) NOT NULL, 
    `visibility` enum('friends','selected','private') COLLATE utf8_unicode_ci NOT NULL, 
    `position` int(11) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=26 ; 

Maintenant, je veux saisir la première photo (position la plus basse #) de chaque album appartenant à un utilisateur.

Voici ce que je suis en train:

SELECT * FROM albums JOIN photos ON photos.album_id=albums.id WHERE albums.user_id=%s GROUP BY album_id HAVING min(position) 

Mais la clause having ne semble pas avoir un effet. Quel est le problème?

+0

Il me semble maintenant que min (position) est probablement juste de revenir un certain nombre. Cela a du sens en anglais, mais pas en tant que question. Mais 'position = min (position)' ne fonctionne pas non plus, et je n'ai pas de chance avec ORDERing non plus. – mpen

Répondre

1
select * from album, photos 
where album_id=albums.id 
and albums.user_id='user_id' 
and photos.id = (select id from photos where 
album_id = album.id order by position LIMIT 1) 
+0

Cela ressemble à ça fonctionne. Est-il vraiment nécessaire d'utiliser une sous-requête? Cela semble si simple dans ma tête, mais je suppose que non dans SQL. – mpen

+0

Je pense que c'est nécessaire – tekBlues

+0

En fait, je pense qu'il y a une autre mise en garde. Cela suppose que la 'position' est unique ... ce qu'elle devrait être, mais y at-il de toute façon nous pouvons rendre ceci plus robuste afin qu'il ne renvoie pas plus d'une photo par album si la min (position) n'est PAS unique? Je suis en développement et le système positiong n'est pas tout à fait mis en place: p – mpen

0

Vous pouvez utiliser ORDER BY et LIMIT vos résultats à la première ligne comme ceci:

SELECT photos.* 
FROM 
    albums, photos 
WHERE 
    photos.album_id=albums.id 
    AND albums.user_id=%s 
ORDER BY 
    photos.position ASC 
LIMIT 1 
+1

Chaque utilisateur peut posséder plus d'un album ... – tekBlues

+0

Ahh. Manqué ce détail dans la question. Votre approche de sous-requête fonctionne. – cgmack

Questions connexes