MySQL « Помогите составить запрос с DISTINCT по двум полям + групировкой
Привет всем!=)
Задача написать sql запрос делаюший из сообщений диалоги.
Cущьность User__Model__Messages - это таблица с сообщениями.
User__Model__Messages.whom_user_id - id пользователя чье это сообщение.
User__Model__Messages.whom_user_id - id пользователя кому написал.
Пример что должно получиться:
Я пользователь с user_id = 1 я написал пользователю с $user_id = 2 - 2 сообщяния в ответ он написал мне два. Потом я написал пользоватлю с $user_id = 3 - 1 сообщения. Запрос должен вернуть 2 строки -> это и есть что я подрузомиваю под диалогами(то есть последние сообщения с user=2 и 3).
DUMP:
CREATE TABLE IF NOT EXISTS `User__Model__Messages` (
`message_id` int(11) NOT NULL AUTO_INCREMENT,
`text` mediumtext,
`date` datetime DEFAULT NULL,
`user_id` int(11) DEFAULT NULL,
`whom_user_id` int(11) DEFAULT NULL,
`status` tinyint(1) DEFAULT NULL,
`replied` tinyint(1) DEFAULT NULL,
`deleted` tinyint(1) DEFAULT NULL,
PRIMARY KEY (`message_id`),
KEY `M_User_idx` (`user_id`),
KEY `M_Whom_User_idx` (`whom_user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=12 ;
INSERT INTO `User__Model__Messages` (`message_id`, `text`, `date`, `user_id`, `whom_user_id`, `status`, `replied`, `deleted`) VALUES
(6, 'sfdsfsdfsdfsdfsd', '2011-10-20 22:39:40', 1, 2, 0, 0, 0),
(7, '5435345435432', '2011-10-20 22:39:58', 1, 2, 0, 0, 0),
(8, '34523453245324534252', '2011-10-20 22:40:26', 2, 1, 0, 0, 0),
(9, '234234234234234', NULL, 2, 1, 0, 0, 0),
(10, 'sgsgretertretergerter', '2011-10-21 21:53:20', 1, 3, 0, 0, 0),
(11, 'dsfdsfsdfsd', '2011-10-21 21:54:21', 1, 3, 0, 0, 0);
Кому проши понять так(Doctrine QL):
/** * GeSHi (C) 2004 - 2007 Nigel McNie, 2007 - 2008 Benny Baumann * (http://qbnz.com/highlighter/ and http://geshi.org/) */ .php.geshi_code {font-family:monospace;} .php.geshi_code .imp {font-weight: bold; color: red;} .php.geshi_code .kw1 {color: #b1b100;} .php.geshi_code .kw2 {color: #000000; font-weight: bold;} .php.geshi_code .kw3 {color: #990000;} .php.geshi_code .co1 {color: #666666; font-style: italic;} .php.geshi_code .co2 {color: #666666; font-style: italic;} .php.geshi_code .co3 {color: #0000cc; font-style: italic;} .php.geshi_code .co4 {color: #009933; font-style: italic;} .php.geshi_code .coMULTI {color: #666666; font-style: italic;} .php.geshi_code .es0 {color: #000099; font-weight: bold;} .php.geshi_code .es1 {color: #000099; font-weight: bold;} .php.geshi_code .es2 {color: #660099; font-weight: bold;} .php.geshi_code .es3 {color: #660099; font-weight: bold;} .php.geshi_code .es4 {color: #006699; font-weight: bold;} .php.geshi_code .es5 {color: #006699; font-weight: bold; font-style: italic;} .php.geshi_code .es6 {color: #009933; font-weight: bold;} .php.geshi_code .es_h {color: #000099; font-weight: bold;} .php.geshi_code .br0 {color: #009900;} .php.geshi_code .sy0 {color: #339933;} .php.geshi_code .sy1 {color: #000000; font-weight: bold;} .php.geshi_code .st0 {color: #0000ff;} .php.geshi_code .st_h {color: #0000ff;} .php.geshi_code .nu0 {color: #cc66cc;} .php.geshi_code .nu8 {color: #208080;} .php.geshi_code .nu12 {color: #208080;} .php.geshi_code .nu19 {color:#800080;} .php.geshi_code .me1 {color: #004000;} .php.geshi_code .me2 {color: #004000;} .php.geshi_code .re0 {color: #000088;} .php.geshi_code span.xtra { display:block; }
return $this->createQuery('m')
->select('m.*, IF(COUNT(DISTINCT m.user_id) = 1, m.user_id, NULL), IF(COUNT(DISTINCT m.whom_user_id) = 1, m.whom_user_id, NULL)')
->where('m.user_id = ? OR m.whom_user_id = ?', array($userId, $userId))
->andWhere('m.deleted = ?', 0)
->leftJoin('m.WhomUser')
->leftJoin('m.User')
->groupBy('m.whom_user_id')
->orderBy('m.message_id');
Sql query:
/** * GeSHi (C) 2004 - 2007 Nigel McNie, 2007 - 2008 Benny Baumann * (http://qbnz.com/highlighter/ and http://geshi.org/) */ .mysql.geshi_code {font-family:monospace;} .mysql.geshi_code .imp {font-weight: bold; color: red;} .mysql.geshi_code .kw1 {color: #990099; font-weight: bold;} .mysql.geshi_code .kw2 {color: #990099; font-weight: bold;} .mysql.geshi_code .kw3 {color: #9900FF; font-weight: bold;} .mysql.geshi_code .kw4 {color: #999900; font-weight: bold;} .mysql.geshi_code .kw5 {color: #999900; font-weight: bold;} .mysql.geshi_code .kw6 {color: #FF9900; font-weight: bold;} .mysql.geshi_code .kw7 {color: #FF9900; font-weight: bold;} .mysql.geshi_code .kw8 {color: #9900FF; font-weight: bold;} .mysql.geshi_code .kw9 {color: #9900FF; font-weight: bold;} .mysql.geshi_code .kw10 {color: #CC0099; font-weight: bold;} .mysql.geshi_code .kw11 {color: #CC0099; font-weight: bold;} .mysql.geshi_code .kw12 {color: #009900;} .mysql.geshi_code .kw13 {color: #000099;} .mysql.geshi_code .kw14 {color: #000099;} .mysql.geshi_code .kw15 {color: #000099;} .mysql.geshi_code .kw16 {color: #000099;} .mysql.geshi_code .kw17 {color: #000099;} .mysql.geshi_code .kw18 {color: #000099;} .mysql.geshi_code .kw19 {color: #000099;} .mysql.geshi_code .kw20 {color: #000099;} .mysql.geshi_code .kw21 {color: #000099;} .mysql.geshi_code .kw22 {color: #000099;} .mysql.geshi_code .kw23 {color: #000099;} .mysql.geshi_code .kw24 {color: #000099;} .mysql.geshi_code .kw25 {color: #000099;} .mysql.geshi_code .kw26 {color: #000099;} .mysql.geshi_code .kw27 {color: #00CC00;} .mysql.geshi_code .coMULTI {color: #808000; font-style: italic;} .mysql.geshi_code .co1 {color: #808080; font-style: italic;} .mysql.geshi_code .co2 {color: #808080; font-style: italic;} .mysql.geshi_code .es0 {color: #004000; font-weight: bold;} .mysql.geshi_code .es1 {color: #008080; font-weight: bold;} .mysql.geshi_code .br0 {color: #FF00FF;} .mysql.geshi_code .sy1 {color: #CC0099;} .mysql.geshi_code .sy2 {color: #000033;} .mysql.geshi_code .st0 {color: #008000;} .mysql.geshi_code .nu0 {color: #008080;} .mysql.geshi_code span.xtra { display:block; }
SELECT
u.message_id AS u__message_id,
u.text AS u__text,
u.date AS u__date,
u.user_id AS u__user_id,
u.whom_user_id AS u__whom_user_id,
u.status AS u__status,
u.replied AS u__replied,
u.deleted AS u__deleted,
IF(COUNT(DISTINCT u.user_id) = 1, u.user_id, NULL) AS u__0,
IF(COUNT(DISTINCT u.whom_user_id) = 1, u.whom_user_id, NULL) AS u__1
FROM User__Model__Messages u LEFT JOIN User__Model__Users u2 ON u.whom_user_id = u2.user_id
LEFT JOIN User__Model__Users u3 ON u.user_id = u3.user_id
WHERE ((u.user_id = 1 OR u.whom_user_id = 1) AND u.deleted = 0)
GROUP BY u.whom_user_id
ORDER BY u.message_id
Используя выше написаный запрос получаю 3записи. Непойму как написать групировку.
p.s Простите за то что в 16 лет еще не прочитал не одной книжки по sql. И задаю глупые вопросы.
Задача написать sql запрос делаюший из сообщений диалоги.
Cущьность User__Model__Messages - это таблица с сообщениями.
User__Model__Messages.whom_user_id - id пользователя чье это сообщение.
User__Model__Messages.whom_user_id - id пользователя кому написал.
Пример что должно получиться:
Я пользователь с user_id = 1 я написал пользователю с $user_id = 2 - 2 сообщяния в ответ он написал мне два. Потом я написал пользоватлю с $user_id = 3 - 1 сообщения. Запрос должен вернуть 2 строки -> это и есть что я подрузомиваю под диалогами(то есть последние сообщения с user=2 и 3).
DUMP:
CREATE TABLE IF NOT EXISTS `User__Model__Messages` (
`message_id` int(11) NOT NULL AUTO_INCREMENT,
`text` mediumtext,
`date` datetime DEFAULT NULL,
`user_id` int(11) DEFAULT NULL,
`whom_user_id` int(11) DEFAULT NULL,
`status` tinyint(1) DEFAULT NULL,
`replied` tinyint(1) DEFAULT NULL,
`deleted` tinyint(1) DEFAULT NULL,
PRIMARY KEY (`message_id`),
KEY `M_User_idx` (`user_id`),
KEY `M_Whom_User_idx` (`whom_user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=12 ;
INSERT INTO `User__Model__Messages` (`message_id`, `text`, `date`, `user_id`, `whom_user_id`, `status`, `replied`, `deleted`) VALUES
(6, 'sfdsfsdfsdfsdfsd', '2011-10-20 22:39:40', 1, 2, 0, 0, 0),
(7, '5435345435432', '2011-10-20 22:39:58', 1, 2, 0, 0, 0),
(8, '34523453245324534252', '2011-10-20 22:40:26', 2, 1, 0, 0, 0),
(9, '234234234234234', NULL, 2, 1, 0, 0, 0),
(10, 'sgsgretertretergerter', '2011-10-21 21:53:20', 1, 3, 0, 0, 0),
(11, 'dsfdsfsdfsd', '2011-10-21 21:54:21', 1, 3, 0, 0, 0);
Кому проши понять так(Doctrine QL):
/** * GeSHi (C) 2004 - 2007 Nigel McNie, 2007 - 2008 Benny Baumann * (http://qbnz.com/highlighter/ and http://geshi.org/) */ .php.geshi_code {font-family:monospace;} .php.geshi_code .imp {font-weight: bold; color: red;} .php.geshi_code .kw1 {color: #b1b100;} .php.geshi_code .kw2 {color: #000000; font-weight: bold;} .php.geshi_code .kw3 {color: #990000;} .php.geshi_code .co1 {color: #666666; font-style: italic;} .php.geshi_code .co2 {color: #666666; font-style: italic;} .php.geshi_code .co3 {color: #0000cc; font-style: italic;} .php.geshi_code .co4 {color: #009933; font-style: italic;} .php.geshi_code .coMULTI {color: #666666; font-style: italic;} .php.geshi_code .es0 {color: #000099; font-weight: bold;} .php.geshi_code .es1 {color: #000099; font-weight: bold;} .php.geshi_code .es2 {color: #660099; font-weight: bold;} .php.geshi_code .es3 {color: #660099; font-weight: bold;} .php.geshi_code .es4 {color: #006699; font-weight: bold;} .php.geshi_code .es5 {color: #006699; font-weight: bold; font-style: italic;} .php.geshi_code .es6 {color: #009933; font-weight: bold;} .php.geshi_code .es_h {color: #000099; font-weight: bold;} .php.geshi_code .br0 {color: #009900;} .php.geshi_code .sy0 {color: #339933;} .php.geshi_code .sy1 {color: #000000; font-weight: bold;} .php.geshi_code .st0 {color: #0000ff;} .php.geshi_code .st_h {color: #0000ff;} .php.geshi_code .nu0 {color: #cc66cc;} .php.geshi_code .nu8 {color: #208080;} .php.geshi_code .nu12 {color: #208080;} .php.geshi_code .nu19 {color:#800080;} .php.geshi_code .me1 {color: #004000;} .php.geshi_code .me2 {color: #004000;} .php.geshi_code .re0 {color: #000088;} .php.geshi_code span.xtra { display:block; }
return $this->createQuery('m')
->select('m.*, IF(COUNT(DISTINCT m.user_id) = 1, m.user_id, NULL), IF(COUNT(DISTINCT m.whom_user_id) = 1, m.whom_user_id, NULL)')
->where('m.user_id = ? OR m.whom_user_id = ?', array($userId, $userId))
->andWhere('m.deleted = ?', 0)
->leftJoin('m.WhomUser')
->leftJoin('m.User')
->groupBy('m.whom_user_id')
->orderBy('m.message_id');
Sql query:
/** * GeSHi (C) 2004 - 2007 Nigel McNie, 2007 - 2008 Benny Baumann * (http://qbnz.com/highlighter/ and http://geshi.org/) */ .mysql.geshi_code {font-family:monospace;} .mysql.geshi_code .imp {font-weight: bold; color: red;} .mysql.geshi_code .kw1 {color: #990099; font-weight: bold;} .mysql.geshi_code .kw2 {color: #990099; font-weight: bold;} .mysql.geshi_code .kw3 {color: #9900FF; font-weight: bold;} .mysql.geshi_code .kw4 {color: #999900; font-weight: bold;} .mysql.geshi_code .kw5 {color: #999900; font-weight: bold;} .mysql.geshi_code .kw6 {color: #FF9900; font-weight: bold;} .mysql.geshi_code .kw7 {color: #FF9900; font-weight: bold;} .mysql.geshi_code .kw8 {color: #9900FF; font-weight: bold;} .mysql.geshi_code .kw9 {color: #9900FF; font-weight: bold;} .mysql.geshi_code .kw10 {color: #CC0099; font-weight: bold;} .mysql.geshi_code .kw11 {color: #CC0099; font-weight: bold;} .mysql.geshi_code .kw12 {color: #009900;} .mysql.geshi_code .kw13 {color: #000099;} .mysql.geshi_code .kw14 {color: #000099;} .mysql.geshi_code .kw15 {color: #000099;} .mysql.geshi_code .kw16 {color: #000099;} .mysql.geshi_code .kw17 {color: #000099;} .mysql.geshi_code .kw18 {color: #000099;} .mysql.geshi_code .kw19 {color: #000099;} .mysql.geshi_code .kw20 {color: #000099;} .mysql.geshi_code .kw21 {color: #000099;} .mysql.geshi_code .kw22 {color: #000099;} .mysql.geshi_code .kw23 {color: #000099;} .mysql.geshi_code .kw24 {color: #000099;} .mysql.geshi_code .kw25 {color: #000099;} .mysql.geshi_code .kw26 {color: #000099;} .mysql.geshi_code .kw27 {color: #00CC00;} .mysql.geshi_code .coMULTI {color: #808000; font-style: italic;} .mysql.geshi_code .co1 {color: #808080; font-style: italic;} .mysql.geshi_code .co2 {color: #808080; font-style: italic;} .mysql.geshi_code .es0 {color: #004000; font-weight: bold;} .mysql.geshi_code .es1 {color: #008080; font-weight: bold;} .mysql.geshi_code .br0 {color: #FF00FF;} .mysql.geshi_code .sy1 {color: #CC0099;} .mysql.geshi_code .sy2 {color: #000033;} .mysql.geshi_code .st0 {color: #008000;} .mysql.geshi_code .nu0 {color: #008080;} .mysql.geshi_code span.xtra { display:block; }
SELECT
u.message_id AS u__message_id,
u.text AS u__text,
u.date AS u__date,
u.user_id AS u__user_id,
u.whom_user_id AS u__whom_user_id,
u.status AS u__status,
u.replied AS u__replied,
u.deleted AS u__deleted,
IF(COUNT(DISTINCT u.user_id) = 1, u.user_id, NULL) AS u__0,
IF(COUNT(DISTINCT u.whom_user_id) = 1, u.whom_user_id, NULL) AS u__1
FROM User__Model__Messages u LEFT JOIN User__Model__Users u2 ON u.whom_user_id = u2.user_id
LEFT JOIN User__Model__Users u3 ON u.user_id = u3.user_id
WHERE ((u.user_id = 1 OR u.whom_user_id = 1) AND u.deleted = 0)
GROUP BY u.whom_user_id
ORDER BY u.message_id
Используя выше написаный запрос получаю 3записи. Непойму как написать групировку.
p.s Простите за то что в 16 лет еще не прочитал не одной книжки по sql. И задаю глупые вопросы.
1 ответов
Вот решение:
SELECT User__Model__Messages.*
FROM
User__Model__Messages join
(
SELECT
if(user_id=1,whom_user_id,user_id) AS user_id_other,
MAX(date) as date_time_max
FROM User__Model__Messages
WHERE user_id=1 OR whom_user_id=1
GROUP BY IF(user_id=1,whom_user_id,user_id)
) as t on if(user_id=1,whom_user_id,user_id)=user_id_other AND date=date_time_max
WHERE user_id=1 OR whom_user_id=1
Спасибо всем большое за сторание.
SELECT User__Model__Messages.*
FROM
User__Model__Messages join
(
SELECT
if(user_id=1,whom_user_id,user_id) AS user_id_other,
MAX(date) as date_time_max
FROM User__Model__Messages
WHERE user_id=1 OR whom_user_id=1
GROUP BY IF(user_id=1,whom_user_id,user_id)
) as t on if(user_id=1,whom_user_id,user_id)=user_id_other AND date=date_time_max
WHERE user_id=1 OR whom_user_id=1
Спасибо всем большое за сторание.
SELECT m1.*
FROM (
SELECT m2.* FROM User__Model__Messages m2
WHERE m2.user_id=1
ORDER BY m2.`date` DESC
) m1
GROUP BY m1.whom_user_id