Сергей Ш.
293 повідомлення
#12 років тому
Здравствуйте, имеется таблица контактов (oid,uid) и таблица сообщений (from,to,time,msg) , задача стоит чтобы по oid вывести список контактов и к каждому последние 10 сообщений с ним на mysql. как это лучше сделать?, работать все должно быстро.
Андрей Халецкий
3562 повідомлення
#12 років тому
Читать про JOIN
Сергей Ш.
293 повідомлення
#12 років тому
Я читал, но там как я понимаю будет в каждой строке дублироваться инфа пользователя.
хотелось бы полуяить ответ вида },..]
Дима Г.
87 повідомлень
#12 років тому
SELECT oid, uid, `from` , `to` , `time` , message
FROM contacts
JOIN msg
WHERE contacts.oid =1
AND msg.from = contacts.oid
AND msg.to = contacts.uid
LIMIT 10




CREATE TABLE IF NOT EXISTS `msg` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`from` int(11) NOT NULL,
`to` int(11) NOT NULL,
`time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`message` text NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=6 ;


INSERT INTO `msg` (`id`, `from`, `to`, `time`, `message`) VALUES
(1, 1, 2, '2013-01-20 17:55:08', '1'),
(2, 1, 2, '2013-01-20 17:55:08', '2'),
(3, 1, 4, '2013-01-20 17:55:08', '3'),
(4, 2, 4, '2013-01-20 17:55:08', '4'),
(5, 2, 3, '2013-01-20 17:55:08', '5');


CREATE TABLE IF NOT EXISTS `contacts` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`oid` int(11) NOT NULL,
`uid` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=6 ;


INSERT INTO `contacts` (`id`, `oid`, `uid`) VALUES
(1, 1, 2),
(2, 1, 3),
(3, 1, 4),
(4, 2, 1),
(5, 2, 3);




oid uid from to time message
1 2 1 2 2013-01-20 17:55:08 1
1 2 1 2 2013-01-20 17:55:08 2
1 4 1 4 2013-01-20 17:55:08 3
Елена Б.
6863 повідомлення
#12 років тому
Цитата ("FaradayStudio"):
Я читал, но там как я понимаю будет в каждой строке дублироваться инфа пользователя.

Чем же она так категорически мешает?
Сергей Ш.
293 повідомлення
#12 років тому
Gritskif, спасибо, попробую.
floppox, не категорически, просто больший расход ресурсов. Скорее всего буду делать таки сначала загрузку списка контактов, а потом подгрузка сообщений по клику.
Виталий Москвин
204 повідомлення
#12 років тому
Цитата ("FaradayStudio"):
Gritskif, спасибо, попробую.
floppox, не категорически, просто больший расход ресурсов. Скорее всего буду делать таки сначала загрузку списка контактов, а потом подгрузка сообщений по клику.

Один умный человек сказал - "Никогда не занимайтесь профилированием кода во время разработки. Иначе вы так никогда и не закончите начатое, а увязнете в профилировании."
Вы заметили большую нагрузку при вашем запросе? Если нет, зачем беспокоиться о нагрузке заранее?
Кроме того в запросе можно указать какие столбцы доставать из объединяемых таблиц.
Елена Б.
6863 повідомлення
#12 років тому
Цитата ("FaradayStudio"):
floppox, не категорически, просто больший расход ресурсов

А инфы о пользователе так много, кто она существенна по сравнению с текстом сообщения?
Тогда две выборки. Вот только я не представляю себе, что это должно быть. чтоб стоило отдельного запроса.
А вообще, попытка извлечь из SQL древовидную структуру несколько... наивна, что ли.