|
Вопрос # 6 569/ вопрос открыт / |
|
Здравствуйте!
Есть две таблицы
DROP TABLE IF EXISTS `users`;
CREATE TABLE IF NOT EXISTS `users` (
`uid` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`ip_address` varchar(15) NOT NULL,
`status` tinyint(1) UNSIGNED ZEROFILL NOT NULL DEFAULT '0',
`nick` varchar(60) NOT NULL,
`surname` varchar(20) NOT NULL,
`name` varchar(20) NOT NULL,
`patronymic` varchar(20) NOT NULL,
`cabinet` smallint(3) DEFAULT NULL,
`pc_name` varchar(20) NOT NULL,
`client_version` varchar(10) NOT NULL,
`admin_status` tinyint(1) UNSIGNED ZEROFILL NOT NULL DEFAULT '0',
`admin_flags` varchar(3) NOT NULL,
`connection_time` datetime DEFAULT NULL,
`about` varchar(2000) NOT NULL,
PRIMARY KEY (`uid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;
INSERT INTO `users` (`uid`, `ip_address`, `status`, `nick`, `surname`, `name`, `patronymic`, `cabinet`, `pc_name`,
`client_version`, `admin_status`, `admin_flags`, `connection_time`, `about`) VALUES
(NULL, '192.168.0.2', 1, 'Shouldercannon', '', '', '', 305, 'ROMAN', '1.0.0.0', 1, 'z', '2013-03-20 00:00:00', ''),
(NULL, '192.168.0.3', 1, 'Kira', '', '', '', 303, 'KIRA', '1.0.0.0.0', 1, 'ab', '2013-03-20 10:14:46', ''),
(NULL, '192.168.0.4', 1, 'Гость', '', '', '', 302, '302-4', '1.0.0.1', 0, '', '2013-03-20 00:00:55', ''),
(NULL, '192.168.0.5', 0, 'Тестер', '', '', '', 502, '502-1', '1.0.1.1', 0, '', '2013-03-20 00:10:55', '');
DROP TABLE IF EXISTS `private_messages`;
CREATE TABLE IF NOT EXISTS `private_messages` (
`uid` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`from` int(2) UNSIGNED NOT NULL,
`to` int(2) UNSIGNED NOT NULL,
`date` datetime DEFAULT NULL,
`message` varchar(2000) NOT NULL,
PRIMARY KEY (`uid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;
INSERT INTO `private_messages` (`uid`, `from`, `to`, `date`, `message`) VALUES
(NULL, 1, 1, '2013-03-20 10:00:00', 'Привет'),
(NULL, 3, 1, '2013-03-20 10:01:27', 'Добрый'),
(NULL, 2, 1, '2013-03-20 10:02:46', 'Как дела'),
(NULL, 4, 1, '2013-03-20 10:04:12', 'Нормально');
Так я получаю всё содержимое private_messages, где вместо from и to подставляются из users ники пользователей
<?php
include "dbconnect.php";
// Проверка на пустоту
if (empty($_GET['usrid']) || empty($_GET['from']) || empty($_GET['pmid'])) {
die;
}
$query = "SELECT `tpm`.`uid`, `tusr_from`.`nick` AS `from`, `tusr_to`.`nick` AS `to`, `tpm`.`date`, `tpm`.`message`
FROM `private_messages` AS `tpm`
JOIN `users` AS `tusr_from` ON `tusr_from`.`uid` = `tpm`.`from`
JOIN `users` AS `tusr_to` ON `tusr_to`.`uid` = `tpm`.`to`
WHERE `tpm`.`uid` >= '".intval(mysql_real_escape_string($_GET['pmid']))."'
ORDER BY `tpm`.`uid`";
$result = mysql_query($query) or die ("ERROR: ".mysql_error());
while ($row = mysql_fetch_array($result)) // Берём результаты из каждой строки
echo $row['uid'].'~'.$row['from'].'~'.$row['to'].'~'.$row['date'].'~'.$row['message'].'!end-post'; // Выводим данные
?>
Помогите, пожалуйста, сделать, чтобы выводились сообщения от указанных from и to
|
Вопрос задал: Shouldercannon (статус: Посетитель)
Вопрос отправлен: 4 декабря 2014, 15:41
Состояние вопроса: открыт, ответов: 1.
|
Ответ #1. Отвечает эксперт: Ins
Здравствуйте, Shouldercannon!
Во первых следует отказаться от mysql и перейти на PDO или mysqli, во вторых в данном случае вообще не нужно использовать die, в третьих никогда не нужно показывать юзерам ошибки пыхи и мускула. нужно писать их в лог, а выводить свой текст. Это касательно пыхи.
По мускулу:
1) создать индексы на поля: from и to. в данном случае отдельный индекс для каждого поля т.к. используется OR.
2) Запрос приложен. Показывает приватные сообщения для/от пользователя под номером 1.
3) Сортировку лучше делать по дате/времени. оно ка кто логичнее.
4) Поле uid из таблицы сообщений выкинуть, не нужно оно там.
5) Если уже используется InnoDB(который требует "ведро" памяти) - нужно пользоваться его преимуществами, в данном случае внешними ключами
Приложение: Переключить в обычный режим- SELECT `tpm`.`uid`, `tusr_from`.`nick` AS `from`, `tusr_to`.`nick` AS `to`, `tpm`.`date`,
`tpm`.`message`
- FROM `private_messages` AS `tpm`
- JOIN `users` AS `tusr_from` ON `tusr_from`.`uid` = `tpm`.`from`
- JOIN `users` AS `tusr_to` ON `tusr_to`.`uid` = `tpm`.`to`
- WHERE `tpm`.`from` = '1' or `tpm`.`to` = '1'
- ORDER BY `tpm`.`date`
|
Ответ отправил: Ins (статус: 1-ый класс)
Время отправки: 15 декабря 2014, 06:53
|
Мини-форум вопроса
Мини-форум пуст.
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|