Mysql sorgu başarısız, yardıma ihtiyacım var :)

4 Cevap php

Ben bir tablo var PICTURES:

username varchar(50) 
picture_id varchar(50) 
datetime 

... Ve ben bir tablo var FRIENDS:

user_1 varchar(50) 
user_2 varchar(50)  
datetime 

Eğer web sitesinde arkadaşlar varsa adınızı user_1 gider, ve arkadaşınız USERNAME go user_2. Her yeni arkadaş yeni bir satır için ...

Ben bir kullanıcı (user_1) ve arkadaşlarının son 5 resim göstermek istiyorum

bu yüzden deneyin

SELECT p.picture_id, p.datetime
FROM pictures AS p
WHERE p.username = (
    SELECT f.user_2
    FROM friends AS f
    WHERE f.user_1 = '(ENTER USERNAME HERE)'
    ORDER BY f.datetime DESC
    LIMIT 5
)
ORDER BY p.datetime DESC;

Gördüğünüz gibi, sorgu dönüş birden fazla satır yani ... Ben sizin yardımınıza veya bana bu çözümü yönetmek için öneriler gerek!

4 Cevap

IN yerine de = kullanarak deneyin WHERE p.username = (. Eğer 5 satır seçerek konum beri = oldukça mantıklı değil.

SELECT p.picture_id, p.datetime
FROM pictures AS p
WHERE p.username IN (
    SELECT f.user_2
    FROM friends AS f
    WHERE f.user_1 = '(ENTER USERNAME HERE)'
    ORDER BY f.datetime DESC
    LIMIT 5
)
ORDER BY p.datetime DESC;

Ben bunun yerine JOIN denemenizi öneririz:

SELECT
    p.picture_id, p.datetime
FROM 
    friends AS f 
    INNER JOIN pictures AS p ON f.user_2 = p.username
WHERE
    f.user_1 = '(ENTER USERNAME HERE)'
ORDER BY
    p.datetime DESC
LIMIT 5

Bu size user_1 'nin arkadaşlarının herhangi birinden son 5 fotoğraf verecektir

Ben size each arkadaşlarınızın resimlerin tüm arasında arkadaş, değil son 5 resimlerin en son 5 resimleri istiyorum demek varsayıyorum.

Bu StackOverflow çok sık görünen greatest-n-per-group sorunlardan biridir. Normalde sorun one, her gruptan üst bulmak için, ama burada en iyi 5 ya da başka bir miktar istediğiniz zaman bunu çözmek nasıl:

SELECT p1.*
FROM friends AS f
JOIN pictures AS p1 ON (f.user_2 = p1.username)
LEFT OUTER JOIN pictures AS p2 ON (p1.username = p2.username
    AND p1.datetime < p2.datetime)
WHERE f.user_1 = ?
GROUP BY p1.picture_id
HAVING COUNT(*) < 5;

Açıklama: her resim için p1 bu benim arkadaşlarından biri, aynı arkadaşı ve bir daha yeni datetime ile ait fotoğraf saymak aittir. En son olarak 5 olan resim more son olarak daha az 5-other resim olması gerekir.

WHERE p.username in(subquery) için WHERE p.username =(subquery) değiştirmeyi deneyin

SEÇ p.picture_id, p.username IN (f.datetime DESC WHERE f.user_1 = '() BURAYA adınızı girin' SİPARİŞ f AS dostları f.user_2 SEÇİN p AS resim DAN p.datetime LİMİT 5) p.datetime DESC ORDER BY;