2014-01-25 3 views
1

У меня есть следующие "tblA" и "tblB" стол:групп другими, чем имя приемника различных именами пользователей

CREATE TABLE if not exists tblA 
(
    id int(11) NOT NULL auto_increment, 
    sender varchar(255), 
    receiver varchar(255), 
    msg varchar(255), 
    date timestamp, 
    PRIMARY KEY (id) 
); 

CREATE TABLE if not exists tblB 
(
    id int(11) NOT NULL auto_increment, 
    sno varchar(255), 
    name varchar(255), 
    PRIMARY KEY (id) 
); 

INSERT INTO tblA (sender, receiver, msg,date) VALUES 
('1', '2', 'buzz ...','2011-08-21 14:11:09'), 
('1', '2', 'test ...','2011-08-21 14:12:19'), 
('1', '2', 'check ...','2011-08-21 14:13:29'), 
('1', '1', 'test2 ...','2011-08-21 14:14:09'), 
('2', '1', 'check2 ...','2011-08-21 14:15:09'), 
('2', '1', 'test3 ...','2011-08-21 14:16:09'), 
('1', '2', 'buzz ...','2011-08-21 14:17:09'), 
('1', '2', 'test ...','2011-08-21 14:18:19'), 
('1', '2', 'check ...','2011-08-21 14:19:29'), 
('1', '1', 'test2 ...','2011-08-21 14:10:09'), 
('3', '1', 'check2 ...','2011-08-21 14:21:09'), 
('3', '1', 'test3 ...','2011-08-21 14:22:09'), 
('3', '2', 'buzz ...','2011-08-21 14:24:09'), 
('3', '2', 'test ...','2011-08-21 14:25:19'), 
('1', '3', 'check ...','2011-08-21 14:26:29'), 
('1', '3', 'test2 ...','2011-08-21 14:27:09'), 
('2', '3', 'check2 ...','2011-08-21 14:28:09'), 
('2', '3', 'test3 ...','2011-08-21 14:29:09'), 
('1', '2', 'check3 ...','2011-08-21 14:23:09'), 
('1', '4', 'test2 ...','2011-08-21 14:27:09'), 
('1', '5', 'test2 ...','2011-08-21 14:27:09'), 
('2', '6', 'check2 ...','2011-08-21 14:28:09'), 
('2', '7', 'test3 ...','2011-08-21 14:29:09'), 
('8', '2', 'check3 ...','2011-08-21 14:23:09'); 


INSERT INTO tblB (sno, name) VALUES 
('1', 'Aa'), 
('2', 'Bb'), 
('3', 'Cc'), 
('4', 'Dd'), 
('5', 'Ee'), 
('6', 'Ff'), 
('7', 'Gg'), 
('8', 'Hh'); 

Я хочу, чтобы список людей Aa разговаривает с упорядоченным по дате (последняя запись для каждой группы пользователей) ,

Bb 
Cc 
Dd 
Ee 
Ff 
Gg 
Hh 

Я застревать о том, как группировать их, не включая "Aa" в одном запросе.

+1

где ваш код запроса? –

ответ

2

Если я правильно понимаю:

select b.name 
from tblA a join 
    tblB b 
    on b.id in (a.receiver, a.sender) 
where b.name <> 'Aa' 
order by date desc; 

Here является SQL Скрипки. Обратите внимание, что ваш код имеет несколько точек с запятой, которые должны быть запятыми.

EDIT:

Если вы хотите самую последнюю дату, а затем использовать:

select b.name 
from tblA a join 
    tblB b 
    on b.id in (a.receiver, a.sender) 
where b.name <> 'Aa' 
group by b.name 
order by max(date) desc; 

EDIT II:

Чтобы отфильтровать строки, которые просто 'Aa':

select b.name 
from tblA a join 
    tblB b 
    on b.id in (a.receiver, a.sender) 
where b.name <> 'Aa' and 
     exists (select 1 
       from tblB b2 
       where b2.name = 'Aa' and 
        b2.id in (a.receiver, a.sender) 
      ) 
group by b.name 
order by max(date) desc; 
+0

Сэр можно получить запрос примерно так, как вы заявили здесь: http://stackoverflow.com/questions/18683525/how-to-retreive-grouped-messages-ordered-by-date-sql 'select (случай, когда приемник = 'Dave', затем Sender else Receiver end) из сообщений m где «Dave» in (Receiver, Sender) группа по (случай, когда ресивер = «Dave», а затем отправитель еще приемник) order max (date) desc; ' – jason

+0

@jason. , , Ситуации различны, потому что имя хранилось непосредственно в таблице сообщений в это время. В этом случае имя находится в отдельной таблице, что приводит к тому, что я считаю более элегантным. –

+0

Также сэр http://www.sqlfiddle.com/#!2/49f8c/9 здесь есть другие пользователи, кроме 'Aa' или' 1'. Как удалить остальные. – jason

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