2016-01-23 3 views
1

Мне нужно сделать запрос, который вернет мне количество сообщений для диалога каждого пользователя. Я попытался сделать это сам, но он дает мне количество сообщений из всех диалогов. Вот мой запрос, который содержит параметры, которые мне нужны.Сделать запрос для подсчета сообщений для каждого диалогового окна

SELECT COUNT(*) 
FROM message, dialog 
WHERE (dialog.username LIKE 'acid') 
AND (message.checkms=0) 
AND (message.messender NOT LIKE 'acid') 
AND (dialog.iddialog=message.iddialog) 

Это результат. Помощь Pls! enter image description here

CREATE TABLE `users` ( 
`username` varchar(45) CHARACTER SET utf8 NOT NULL, 
`enabled` bit(1) NOT NULL, 
`password` varchar(60) CHARACTER SET utf8 NOT NULL, 
`name` varchar(30) CHARACTER SET utf8 NOT NULL, 
`surname` varchar(30) CHARACTER SET utf8 NOT NULL, 
`email` varchar(50) CHARACTER SET utf8 NOT NULL, 
`gender` varchar(30) CHARACTER SET utf8 NOT NULL, 
`age` varchar(2) NOT NULL, 
`weight` varchar(2) NOT NULL, 
`height` varchar(3) NOT NULL, 
`sport` varchar(50) CHARACTER SET utf8 NOT NUlL, 
`place` varchar(400) CHARACTER SET utf8 NOT NULL, 
`photo` varchar(100) NOT NULL, 
PRIMARY KEY (`username`) 
) ENGINE=InnoDB DEFAULT CHARSET=UTF8; 

create table dialog 
(
`iddialog` int NOT NULL auto_increment, 
`reciever` varchar(50) CHARACTER SET utf8 NOT NULL, 
`username`varchar(45) CHARACTER SET utf8 NOT NULL, 
PRIMARY KEY(`iddialog`), 
foreign key (`username`) references users(`username`) 
)ENGINE=InnoDB DEFAULT CHARSET=UTF8; 

create table message(
`idmessage` BIGINT not null auto_increment, 
`text` varchar(300) character set utf8 NOT NULL, 
`date` varchar(40) NOT NULL, 
`iddialog` int NOT NULL, 
`messender` varchar(50), 
`checkms` boolean, 
primary key (`idmessage`), 
foreign key (`iddialog`) references dialog(`iddialog`) 
)ENGINE=InnoDB DEFAULT CHARSET=UTF8; 
+0

Получите сообщения диалогов uers, затем выберите пользователя и диалог GROUP BY, затем COUNT сообщения каждой группы. – philipxy

+0

В результате вашего запроса отображается 1 запись. Разве это не верно для пользователя, которого вы запросили? – Incognito

ответ

2

Если я правильно понять вас, это звучит, как вам нужно group by имя пользователя:

SELECT d.username, COUNT(*) 
FROM message m 
    join dialog d on m.iddialog = d.iddialog 
WHERE d.username = 'acid' 
    AND m.checkms=0 
    AND m.messender != 'acid' 
GROUP BY d.username 

Несколько быстрых заметок. Лучше использовать более стандартный синтаксис ansi join. Также не нужно использовать like, если вы не используете подстановочный знак - это эквивалентно равным без.


Ваш вопрос может потребоваться немного уточнения. Возможно, вам также понадобится группа d.iddialog. Это вернет результаты для каждого пользователя для каждого диалогового окна:

SELECT d.username, d.iddialog, COUNT(*) 
FROM message m 
    join dialog d on m.iddialog = d.iddialog 
WHERE d.username = 'acid' 
    AND m.checkms=0 
    AND m.messender != 'acid' 
GROUP BY d.username, d.iddialog 
+0

thanx много, брат! вы экономите мое время !!!!! –

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