SQL - Bu sorguyu gerçekleştirmek için en etkili yolu?

1 Cevap php

Ben temelde üç tablo, mesajları, görüntüleri ve postimages (bu sadece diğer tabloları hem kimliklerini içerir ve gerekirse birden fazla her yazı resim ve her görüntü birden fazla mesaj olarak yeniden sağlar) var.

(Varsa) Her bir tek, küçük resim ile birlikte, tüm mesajların başlıklarını listelemek için çalışıyorum

Ben aşağıdaki ile yapabilirsiniz:

    $sql ="SELECT * FROM posts p, images im, postimages pi WHERE
    AND pi.post_id = p.id
    AND pi.image_id = im.image_id
    ORDER BY created_at LIMIT 10";

Ancak, tabii ki, birden fazla görüntü olması durumunda, kayıt iki kez gösterilir.

Ben muhtemelen bir alt sorgu ile bunu yapabileceğini biliyorum, ama bu korkunç verimsiz görünmektedir. Bu etrafında daha zarif bir yolu var mı?

Herhangi bir tavsiye mutluluk duyacağız. Teşekkürler.

1 Cevap

select
    *
from
    posts p
    left outer join (select post_id, max(image_id) as image_id 
        from postimages group by post_id) pi on
        p.id = pi.post_id
    left outer join images im on
        pi.image_id = im.image_id

Sadece değil satıra kez idam edilecek olan böylece alt sorgu yapabilirsiniz. Bu şekilde, bütün bir tablo için bir alt sorgu olarak kullanılan ve daha sonra mesajların katıldı oluyor. Eğer ilk görüntü almak istiyorsanız Açıkçası, bu MIN(image_id) olabilir. Gerçekten, ne olursa olsun tercih ederim.

Düzenleme: mesaj yok bile bu görüntüleri yakalamak için left outer join olarak yapılmıştır. Bu null bu var olmayan olur durumda görüntü için dönecektir.