0 votes

La sous-requête Mysql échoue, besoin d'aide :)

J'ai une table PICTURES :

username varchar(50) 
picture_id varchar(50) 
datetime 

...et j'ai une table FRIENDS :

user_1 varchar(50) 
user_2 varchar(50)  
datetime 

Lorsque vous avez des amis sur le site web, votre nom d'utilisateur apparaît dans la liste. user_1 et le nom d'utilisateur de votre ami va dans user_2 . Pour chaque nouvel ami, une nouvelle ligne...

Je veux afficher les 5 dernières photos des amis d'un utilisateur (user_1)

alors j'essaie

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;

Et comme vous pouvez le voir, la sous-requête renvoie plus d'une ligne, donc... J'ai besoin de votre aide ou de vos suggestions pour m'aider à trouver cette solution !

2voto

Marek Karbarz Points 14870

Essayez d'utiliser IN au lieu de = en WHERE p.username = ( . Puisque vous sélectionnez jusqu'à 5 lignes = n'a pas tout à fait de sens.

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;

2voto

K Prime Points 4333

Je vous suggère d'essayer un JOIN au lieu de cela :

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

Vous obtiendrez ainsi les 5 dernières photos de n'importe quelle user_1 Les amis d'Erika

2voto

Bill Karwin Points 204877

Je suppose que vous souhaitez obtenir les 5 dernières photos de chacun des amis, et non les 5 dernières photos parmi toutes les photos des amis.

Il s'agit de l'un des greatest-n-per-group qui apparaît si fréquemment sur StackOverflow. Normalement, le problème consiste à trouver les meilleurs un de chaque groupe, mais voici comment je résous le problème lorsque vous voulez les 5 premiers ou une autre quantité :

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;

Explication : pour chaque image p1 qui appartient à l'un de mes amis, compter les images appartenant au même ami et dont la date est plus récente. Les photos qui sont dans les 5 plus récentes doivent avoir moins de 5 autres des images qui sont plus récente.

0voto

Yada Points 9489

Essayez de modifier le WHERE p.username =(subquery) a WHERE p.username in(subquery)

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 ;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X