Mysql подзапрос не удается, нужна помощь :) - PullRequest
0 голосов
/ 20 января 2010

У меня есть таблица PICTURES:

username varchar(50) 
picture_id varchar(50) 
datetime 

... и у меня есть таблица FRIENDS:

user_1 varchar(50) 
user_2 varchar(50)  
datetime 

Когда у вас есть друзья на сайте, ваше имя пользователявходит в user_1, а имя вашего друга в user_2.Для каждого нового друга новая строка ...

Я хочу показать 5 последних фотографий друзей одного пользователя (user_1)

, поэтому я пытаюсь

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;

И, как вы видите, подзапрос возвращает более одной строки, поэтому ... Мне нужна ваша помощь или предложения, чтобы помочь мне управлять этим решением!

Ответы [ 4 ]

2 голосов
/ 20 января 2010

Я предполагаю, что вы хотите получить последние 5 фотографий из каждого друзей, а не последние 5 изображений из всех фотографий друзей.

Это одна из greatest-n-per-group проблемы, которые так часто появляются в StackOverflow.Обычно проблема состоит в том, чтобы найти верхнюю одну из каждой группы, но вот как я ее решаю, когда вы хотите верхнюю 5 или какую-то другую величину:

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;

Объяснение: для каждой картинкиp1, принадлежащий одному из моих друзей, считайте фотографии, принадлежащие одному и тому же другу и с более поздней датой.Снимки последних 5 должны содержать не более 5 других снимков, которые больше последних.

2 голосов
/ 20 января 2010

Я предлагаю вам попробовать JOIN вместо:

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

Это даст вам последние 5 фотографий от любого из user_1 друзей

2 голосов
/ 20 января 2010

Попробуйте использовать IN вместо = в WHERE p.username = (. Поскольку вы выбираете до 5 строк, = не совсем имеет смысла.

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;
0 голосов
/ 20 января 2010

Попробуйте изменить WHERE p.username =(subquery) на WHERE p.username in(subquery)

ВЫБРАТЬ p.picture_id, p.datetime ИЗ картинок AS p ГДЕ p.username IN (ВЫБРАТЬ f.user_2 ИЗ друзей AS)f WHERE f.user_1 = '(введите имя пользователя здесь)' ORDER BY f.datetime DESC LIMIT 5) ORDER BY p.datetime DESC;

...