2010-09-28 2 views
0

En utilisant MySQL, j'ai un ensemble de tables avec des relations 1-> N de membre -> éléments -> photos. J'essaie de sélectionner une liste d'éléments d'un membre + quelques colonnes de la première photo associée (en premier je veux dire la photo avec l'ordre de tri le plus bas).SQL - sélection du premier enregistrement correspondant pour la jointure

Actuellement, j'ai cette requête qui fonctionne, mais semble trop complexe. Y a-t-il un moyen plus simple et/ou comment cette requête pourrait-elle être améliorée? En particulier, je suis préoccupé par l'instruction la plus sélecte - MySQL optimisera-t-il cela uniquement pour travailler avec des photos pour le membre en question et devrais-je utiliser des clauses where supplémentaires pour l'optimiser.

SELECT items.member_id, items.item_id, items.title, p.photo_id, p.blob_id, p.image_width, p.image_height 
FROM items 
LEFT JOIN 
(
    SELECT photos.item_id, photos.photo_id, photos.blob_id, photos.image_width, photos.image_height 
    FROM 
    (
     SELECT item_id, min(sort_order) as min_sort_order 
     FROM photos 
     GROUP BY item_id 
    ) AS x 
    INNER JOIN photos on photos.item_id=x.item_id and photos.sort_order=x.min_sort_order 
) AS p ON items.item_id = p.item_id 
WHERE items.member_id=1 
ORDER BY items.title; 

Répondre

0
SELECT 
     items.member_id, items.item_id, items.title, photo.photo_id, photo.blob_id, photo.image_width, photo.image_height 
FROM 
     items 
JOIN photos on items.item_id = photos.item_id 
JOIN (SELECT item_id, min(sort_order) as min_sort_order 
     FROM photos 
     GROUP BY item_id) min_photo on photos.item_id=min_photo.item_id and photos.sort_order=min_photo.min_sort_order 
WHERE items.member_id=1 
ORDER BY items.title; 
+0

Presque. J'ai oublié de mentionner que les articles ne doivent pas avoir de photo. Cette requête ne renvoie pas ces éléments. –

+0

Dans ce cas, votre requête semble être correcte. – CristiC

Questions connexes