Руслан И.
73 повідомлення
#14 років тому
Привет всем, делаю социалку нужно сделать личные сообщения, сделал как везде просто папка входящие и исходящие, затем решил сделать как здесь, заходишь в сообщения а там контакты с кем ты в диалоге, в общем как аська, список чтоб выводился то я сделал, но при переходе к конкретному диалогу получается выводить только входящие от него сообщения а исходящие от меня к нему нет, подскажите пожалуйста как можно объединить входящие и исходящие сообщения, вот моя таблица личных сообщений
CREATE TABLE IF NOT EXISTS `private_message` (
`idmess` int(11) NOT NULL AUTO_INCREMENT,
`message` text,
`from` int(15) NOT NULL,
`to` int(15) NOT NULL,
`from_read` enum('0','1' DEFAULT NULL,
`to_read` enum('0','1' DEFAULT NULL,
`from_del` enum('0','1' DEFAULT NULL,
`to_del` enum('0','1' DEFAULT NULL,
`from_read_time` varchar(30) DEFAULT NULL,
`to_read_time` varchar(30) DEFAULT NULL,
`from_del_time` varchar(30) DEFAULT NULL,
`to_del_time` varchar(30) DEFAULT NULL,
`create_time` varchar(30) DEFAULT NULL,
PRIMARY KEY (`idmess`),
UNIQUE KEY `idmess_UNIQUE` (`idmess`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=15 ;
Николай Г.
601 повідомлення
#14 років тому
Эм... WHERE ((`from_read` = айди 1 человека) AND (`to_read` = айди 2 человека )) OR ((`to_read`= айди 2 человека ) AND (`from_read` = айди 1 человека))
И отсортировать ORDER BY `create_time`
В чем проблема то?=)
Евгений Б.
5330 повідомлень
#14 років тому
Надо еще только индексы сделать по всем столбцам в запросе + время
Алексей Б.
897 повідомлень
#14 років тому
Есть же примари idmess, по нему и сортировать.
Николай Г.
601 повідомлення
#14 років тому
Действительно, сортировать даже лучше по idmess.
Руслан И.
73 повідомлення
#14 років тому
Спасибо большое, но еще проблема я делаю запрос к двум таблицам, фотографиям юзеров и их инфо, когда выводятся поля выводятся дубли, как с этим бороться?? а если вывожу только сообщения все как нужно.
вот запрос
SELECT pm.*, u.* FROM $tablepm pm, $tableusers u WHERE ((pm.m_to_name='$sess_user' AND (pm.m_from_name ='$withuser') OR ((pm.m_to_name='$withuser' AND (pm.m_from_name ='$sess_user') AND pm.m_from_name = u.m_username ORDER BY m_idmess
Руслан И.
73 повідомлення
#14 років тому
Все уже сам разобрался))) все огромное спасибо
Евгений Б.
5330 повідомлень
#14 років тому
EXPLAIN покажите потом по факту
Руслан И.
73 повідомлення
#14 років тому
SELECT pm.*, u.* FROM $tablepm pm, $tableusers u WHERE ((pm.m_to_name='$sess_user' AND (pm.m_from_name ='$withuser' AND (pm.m_from_name =u.m_username)) OR ((pm.m_to_name='$withuser' AND (pm.m_from_name ='$sess_user' AND (pm.m_from_name =u.m_username)) ORDER BY m_idmess
вот..
а список собеседников вывожу
SELECT pm.*, uf.m_img, u.* FROM $tablepm pm, $tableusfoto uf, $tableusers u
WHERE pm.m_to_name='$sess_user' AND pm.m_from_name = uf.m_username AND pm.m_from_name = u.m_username ORDER BY m_idmess DESC

так, и в цикле удаляю дубликаты собеседников, если такой уже вывелся,
так

$existname = array();
while ($row_pm = mysql_fetch_assoc($pm_inbox_query)) {

if (!in_array($row_pm,$existname)) {

вывожу собеседника и ссылку на папку с перепиской с данным собеседником

}
$existname = $row_pm;
$i++;
}
Руслан И.
73 повідомлення
#14 років тому
Если кто знает, как через запрос к базе вывести поля без повторений, например, поля
сообщение 1| имя отправителя 1 | имя получателя 1
сообщение 2| имя отправителя 1 | имя получателя 1
сообщение 1| имя отправителя 2 | имя получателя 1
сообщение 3| имя отправителя 1 | имя получателя 1
сообщение 2| имя отправителя 2 | имя получателя 1


вывести имя отправителя 1 и имя отправителя 2 по одному разу

подскажите, пожалуйста, если кто нибудь знает.
Евгений Б.
5330 повідомлень
#14 років тому
Destinct или group by смотря как и что Вы хотите
Руслан И.
73 повідомлення
#14 років тому
Спасибо) group by помогло
Руслан И.
73 повідомлення
#14 років тому
Хотя нет не помогло((((((((((((((((((((((( она начинает с первых сообщений и группирует первые попавшиеся, а мне нужно чтоб и последнее сообщение показывалось, тот вариант подходит больше, но при 10000 тысяч сообщений запрос уже 2,5 секунд обрабатывается(((
Николай Г.
601 повідомлення
#14 років тому
Попонятнее, если можно обьясните, что конкретно хотите.
Цитата:
сообщение 1| имя отправителя 1 | имя получателя 1
сообщение 2| имя отправителя 1 | имя получателя 1
сообщение 1| имя отправителя 2 | имя получателя 1
сообщение 3| имя отправителя 1 | имя получателя 1
сообщение 2| имя отправителя 2 | имя получателя 1


вывести имя отправителя 1 и имя отправителя 2 по одному разу


Цитата ("speedi"):
а мне нужно чтоб и последнее сообщение показывалось


Вам нужно чтобы оно показывало сообщение? Или только имена отправителей(по 1 разу)?
Евгений Б.
5330 повідомлень
#14 років тому
Цитата ("speedi"):
а мне нужно чтоб и последнее сообщение показывалось, тот вариант подходит больше, но при 10000 тысяч сообщений запрос уже 2,5 секунд обрабатывается(((

explane покажите

не используйте group by
читаем здесь (первое, что нагуглилось)
Руслан И.
73 повідомлення
#14 років тому
Короче так, захожу я в сообщения а там, люди с кем я уже в контакте, и если есть от него новое сообщение показывает +1 и кусочек сообщения, или если даже нету новых сообщений просто показывает последнее сообщение, от меня или от него..

| |
|фото| Пользователь 1
| |
Сообщения(+1)
________________________________________________
| |
|фото| Пользователь 1
| |
Кусок сообщения
________________________________________________

| |
|фото| Пользователь 1
| |
Я:кусок сообщения
________________________________________________


Как в мобильной версии одноклассников.

Я уже сделал, доработал свой метод, только оповещание о новом сообщение пока не сделал.


Вот код:

$pm_count_inbox = mysql_fetch_array(my_q("SELECT COUNT(*) FROM $tablepm WHERE m_to_name='$sess_user'");
$pm_count = $pm_count_inbox;

###получаю количество всех сообщений адресованных мне
$pm_count = $pm_count - 200;


###отрезаю от количества 200, это будет лимитом в дальнейшем откуда будет браться список собеседников

$pm_twoquery_inbox = mysql_fetch_array(my_q("SELECT m_idmess FROM $tablepm WHERE m_to_name='$sess_user' LIMIT $pm_count,1");

###теперь получаю ид сообщения с которого начну главный запрос

$startidmsg = $pm_twoquery_inbox;

$pm_inbox_query = my_q("SELECT pm.*, uf.m_img, u.* FROM $tablepm pm, $tableusfoto uf, $tableusers u
WHERE pm.m_to_name='$sess_user' AND pm.m_from_name = uf.m_username AND pm.m_from_name = u.m_username AND pm.m_idmess > '$startidmsg' ORDER BY m_idmess DESC LIMIT 200";

### этот запрос обрабатываю в цикле, код который выкладывал выше,

В итоге сколько бы сообщений в базе не было запрос будет выполняться с одинаковой нагрузкой.
Еще пару условий прописать и будет ништяк))
Руслан И.
73 повідомлення
#14 років тому
А вообще у меня еще такая идея, создать отдельную таблицу для контактов,
если пишу человеку первый раз добавляю поле в таблицу dialogs поля
id_dlg | who | withwho |last_msg_id
----------------------------
1 | usr1 | usr 2 |

записываю отправителя, получателя и ид последнего сообщения.

Если диалог уже существует, обновляю записи.
Вадим Т.
3240 повідомлень
#14 років тому
Цитата ("speedi"):
CREATE TABLE IF NOT EXISTS `private_message` (
`idmess` int(11) NOT NULL AUTO_INCREMENT,
`message` text,
`from` int(15) NOT NULL,
`to` int(15) NOT NULL,

int(15) ???

Цитата ("speedi"):
PRIMARY KEY (`idmess`),
UNIQUE KEY `idmess_UNIQUE` (`idmess`)

Зачем нужен UNIQUE KEY на то же поле, что используется и в PRIMARY KEY?

Цитата ("speedi"):
`idmess` int(11) NOT NULL AUTO_INCREMENT,

Почему тут int(11)? Неужели допускаете, что могут быть и отрицательные значения idmess?
Почему бы там не использовать INT UNSIGNED?
Руслан И.
73 повідомлення
#14 років тому
Не знаю)) плохо разбираюсь в типах, int 15 просто не жадный)
Вадим Т.
3240 повідомлень
#14 років тому
Цитата ("speedi"):
Не знаю)) плохо разбираюсь в типах, int 15 просто не жадный)

Ну вот, значит сейчас есть повод разобраться в типах.
В двух словах, int(15) не имеет смысла, так как максимальное положительное значение INT включает в себя лишь 10 цифр.