2014-11-28 4 views
0

У меня проблема: sql. Мне нужно получить для каждого пользователя, самого молодого пользователя, которого он/она следует. У меня есть эти таблицы:Макс (число) и подписчики

Информация о пользователе Таблица (user_inf):

+----------+------------------+---------------+ 
    | name  | address   | date_of_birth | 
    +----------+------------------+---------------+ 
    | Andreas | Martiou 25  | 1990-12-02 | 
    | Anna  | Aiakidon 20  | 1989-07-15 | 
    | Aris  | Papandreou 10 | 1987-03-12 | 
    | Dimitris | Dodonis 3  | 1992-09-07 | 
    | Katerina | 28 Oktobriou 4 | 1993-01-09 | 
    | Kostas | Kasioumi 3  | 1992-12-12 | 
    | Maria | Kalari 8   | 1993-08-31 | 
    | Panos | Aneksartisias 13 | 1991-05-27 | 
    | Petros | Panepistimiou 9 | 1992-04-15 | 
    | Yannis | Ithakis 20  | 1993-07-03 | 
    +----------+------------------+---------------+ 

Пользователь, который следует другому пользователю (следует):

+------------+------------+ 
    | user1_name | user2_name | 
    +------------+------------+ 
    | Aris  | Andreas | 
    | Kostas  | Andreas | 
    | Panos  | Andreas | 
    | Petros  | Andreas | 
    | Yannis  | Andreas | 
    | Aris  | Anna  | 
    | Dimitris | Anna  | 
    | Maria  | Anna  | 
    | Anna  | Aris  | 
    | Maria  | Aris  | 
    | Panos  | Aris  | 
    | Yannis  | Aris  | 
    | Andreas | Katerina | 
    | Kostas  | Katerina | 
    | Aris  | Kostas  | 
    | Maria  | Kostas  | 
    | Anna  | Maria  | 
    | Dimitris | Maria  | 
    | Anna  | Panos  | 
    | Aris  | Panos  | 
    | Kostas  | Panos  | 
    | Maria  | Panos  | 
    | Aris  | Yannis  | 
    | Maria  | Yannis  | 
    +------------+------------+ 

И мой код это один:

select Fol.user2_name 
    from user_inf as Usr, (select user2_name, max(date_of_birth) as MaxDate 
         from user_inf as U 
         inner join follows as F 
         on (F.user2_name = U.name) 
         inner join 
         follows as Fol 
         on(Fol.user2_name = t1.user2_name))t1 
    where t1.MaxDate = Usr.date_of_birth 
    group by Fol.user2_name; 

Проблема в том, что каждый раз я получаю только одно имя всех пользователей или в худшем случае - пустой набор. Спасибо за ваше время.

ответ

1

Вы можете использовать трюк substring_index()/group_concat(), чтобы получить имя самого младшего пользователя. Самый младший пользователь имеет наибольшее значение для date_of_birth, поэтому:

select f.user1_name, 
     substring_index(group_concat(f.user2_name order by u.date_of_birth desc), ',', 1) as youngest 
from follows f join 
    user_inf u 
    on f.user2_name = u.name 
group by f.user1_name; 
+0

Спасибо, друг. Это было очень полезно. – Noisie

Смежные вопросы