Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Можно ли упростить запрос?
 
 автор: kis-kis   (08.01.2007 в 08:33)   письмо автору
 
 

Можно ли упростить данный запрос?


// Отправляем пользователям отчеты о новых внутренних сообщениях
$query = "SELECT * FROM letters WHERE readmess = '0' and rep_send = '0'";
$result=mysql_query($query) or die("<B>Error ".mysql_errno()." :</B> ".mysql_error()."");
if (mysql_num_rows($result)!=0){ 
while($row = mysql_fetch_array($result)) {
$resultc=mysql_query("SELECT * FROM passport WHERE id = '$row[for_user]'") or die("<B>Error ".mysql_errno()." :</B> ".mysql_error()."");
$rowcat = mysql_fetch_array($resultc);
$resultc2=mysql_query("SELECT * FROM passport WHERE id = '$row[userid]'") or die("<B>Error ".mysql_errno()." :</B> ".mysql_error()."");
$rowcat2 = mysql_fetch_array($resultc2);
$send_data = date("Y.m.d H:i:s");
$temp = "
\n\nУ Вас новое внутреннее сообщение на сайте $mm_sitetitle (<a href=$mm_site_url>$mm_site_url</a>) от пользователя $rowcat2[uname], с темой: ''$row[subject]''
\n\n<br><br>Ознакомиться с ним можно в Вашем личном кабинете, в который можно пройти по ссылке ниже\n\n<br><br>
\n\n<a href=$mm_site_url/users/>$mm_site_url/users/</a>\n\n<br>
\n\n<br>Отправлено:</b> $send_data\n\n<br><br>
===================================<br>
Отвечать на данное письмо не нужно<br>
===================================<br>
<br>\n\n- - - - - -
\n\n<br>С уважением,
\n\n<br>$mm_sitetitle
\n\n<br><a href=$mm_site_url>$mm_site_url</a><br>";
$subj = "У Вас новое внутреннее сообщение на сайте $mm_sitetitle";
$body = $temp;
$adds .= "From: ROBOT <$mm_robot_email>\n"; //Мыло робота
$adds .= "X-Sender: <$mm_robot_email>\n";
$adds .= "Return-Path: <$mm_robot_email>\n"; 
$adds .= "X-Priority: 2 (High)\n";
$adds .= "Content-Type: text/html; charset=windows-1251\n";
$mymail="$rowcat[uname] <$rowcat[email]>"; // email адрес пользователя
mail($mymail,$subj,$body,$adds);
$query = "UPDATE letters SET rep_send = '1' WHERE readmess = '0' and rep_send = '0'";
$req = mysql_query($query) or die("<B>Error ".mysql_errno()." :</B> ".mysql_error()."");
}
}

   
 
 автор: kis-kis   (08.01.2007 в 10:06)   письмо автору
 
   для: kis-kis   (08.01.2007 в 08:33)
 

Никто не поможет?

   
 
 автор: kasmanaft   (08.01.2007 в 10:23)   письмо автору
 
   для: kis-kis   (08.01.2007 в 08:33)
 

Какой запрос? И для чего его урощать?

   
 
 автор: kis-kis   (08.01.2007 в 10:44)   письмо автору
 
   для: kasmanaft   (08.01.2007 в 10:23)
 

Вы считаете он грамотно написан?

   
 
 автор: kasmanaft   (08.01.2007 в 12:32)   письмо автору
 
   для: kis-kis   (08.01.2007 в 10:44)
 

Честно говоря я не понял что нужно упрощать ... если имеется ввиду запрос в БД, так в этом скрипте 4 запроса!

   
 
 автор: kis-kis   (08.01.2007 в 12:38)   письмо автору
 
   для: kasmanaft   (08.01.2007 в 12:32)
 

Извините, я имею ввиду данный скрипт...
И как можно сделать чтобы он выполнялся только для тех пользователей у которых rep_mess='1'?
Спасибо.

   
 
 автор: kasmanaft   (08.01.2007 в 13:47)   письмо автору
 
   для: kis-kis   (08.01.2007 в 12:38)
 

Ну если работает, я бы, наверное, так и оставил ... Грубых недочетов я не вижу ...

-- только для тех пользователей у которых rep_mess='1'
на php можно просто добавить проверку перед отсылкой сообщения (или еще раньше), а как это сделать средствами mysql не скажу ... я не мастер всяких закрученных запросов :)

   
 
 автор: Trianon   (08.01.2007 в 16:54)   письмо автору
 
   для: kis-kis   (08.01.2007 в 08:33)
 

В принципе, можно убрать повторы второго и третьего SQL-запросов.

   
 
 автор: kis-kis   (08.01.2007 в 17:32)   письмо автору
 
   для: Trianon   (08.01.2007 в 16:54)
 

Можно полученный код?
>> И как можно сделать чтобы он выполнялся только для тех пользователей у которых rep_mess='1'?
А с условием не поможете?

   
 
 автор: kis-kis   (09.01.2007 в 18:19)   письмо автору
 
   для: kis-kis   (08.01.2007 в 17:32)
 

Trianon, Вы не поможете?

   
 
 автор: Trianon   (09.01.2007 в 19:10)   письмо автору
 
   для: kis-kis   (09.01.2007 в 18:19)
 

<?
$cache
= array();
// Отправляем пользователям отчеты о новых внутренних сообщениях 
$query "SELECT * FROM letters WHERE readmess = '0' and rep_send = '0'"
$result=mysql_query($query) or die("<B>Error ".mysql_errno()." :</B> ".mysql_error().""); 
if (
mysql_num_rows($result)!=0)
{
  while(
$row mysql_fetch_array($result))
  {
    
$usr $row['for_user'];
    
$rowcat = isset($cache[$usr]) ? $cache[$usr] :
        (
$cache[$usr]=mysql_fetch_assoc(mysql_query(
          
"SELECT * FROM passport WHERE id = $usr")));
    
$usr $row['userid'];
    
$rowcat2 = isset($cache[$usr]) ? $cache[$usr] :
        (
$cache[$usr]=mysql_fetch_assoc(mysql_query(
          
"SELECT * FROM passport WHERE id = $usr")));

    
$send_data date("Y.m.d H:i:s");

  
// etc...

   
 
 автор: kis-kis   (09.01.2007 в 21:20)   письмо автору
 
   для: Trianon   (09.01.2007 в 19:10)
 

Спасибо.
А это?
>> И как можно сделать чтобы он выполнялся только для тех пользователей у которых rep_mess='1'?

   
 
 автор: Trianon   (09.01.2007 в 21:36)   письмо автору
 
   для: kis-kis   (09.01.2007 в 21:20)
 

А этого утверждения я не понял.

   
 
 автор: kis-kis   (09.01.2007 в 21:41)   письмо автору
 
   для: Trianon   (09.01.2007 в 21:36)
 

База:


CREATE TABLE `passport` (
  `id` int(11) NOT NULL auto_increment,
  `uname` text NOT NULL,
  `email` text NOT NULL,
  `pass` varchar(50) NOT NULL default '',
  `level` tinyint(4) NOT NULL default '3',
  `avatar` varchar(100) NOT NULL default '',
  `subs` int(1) NOT NULL default '1',
  `rep_mess` int(1) NOT NULL default '1',
  `rep_job` int(1) NOT NULL default '1',
  `rep_bazar` int(1) NOT NULL default '1',
  `last_login` text NOT NULL,
  `last_ip` text NOT NULL,
  `bill_job` int(1) default '0',
  `billexpdate` date NOT NULL default '0000-00-00',
  `billcontname` text NOT NULL,
  `billtel` text NOT NULL,
  `vkey` varchar(30) NOT NULL default '',
  `status` tinyint(1) default '0',
  `regdate` date NOT NULL default '0000-00-00',
  KEY `id` (`id`),
  KEY `bill_job` (`bill_job`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 PACK_KEYS=0 AUTO_INCREMENT=26;

INSERT INTO `passport` VALUES (1, 'maXim', 'max@max.max', 'c8837b23ff8aaa8a2dde915473ce0991', 3, 'av-1.jpg', 0, 0, 1, 1, '09.01.2007 21:15:23', '127.0.0.1', 1, '2007-12-31', '', '', '', 1, '0000-00-00');


Чтобы отчеты отправлялись только тем, у кого в ячейке rep_mess стоит 1. Теперь понятно?

   
 
 автор: Trianon   (09.01.2007 в 21:46)   письмо автору
 
   для: kis-kis   (09.01.2007 в 21:41)
 


    $usr = $row['for_user']; 
    $rowcat = isset($cache[$usr]) ? $cache[$usr] : 
        ($cache[$usr]=mysql_fetch_assoc(mysql_query( 
          "SELECT * FROM passport WHERE id = $usr"))); 
    if($rowcat['rep_mess'] != '1')
        continue;
    $usr = $row['userid']; 
    $rowcat2 = isset($cache[$usr]) ? $cache[$usr] : 
        ($cache[$usr]=mysql_fetch_assoc(mysql_query( 
          "SELECT * FROM passport WHERE id = $usr"))); 

   
 
 автор: kis-kis   (09.01.2007 в 21:54)   письмо автору
 
   для: Trianon   (09.01.2007 в 21:46)
 

Trianon - Вы гений!

Вы не перестаете меня удивлять...
Можно вопрос?

Откуда такие познания? ;-)

И еще - если пользователей будет около 1000 - это не сильно будет нагружать хостера?

   
 
 автор: Trianon   (09.01.2007 в 23:34)   письмо автору
 
   для: kis-kis   (09.01.2007 в 21:54)
 

Вероятно, можно вообще обойтись одним SELECTом:

SELECT l.user_id as fromid, l.for_user as toid, 
  f.uname as fromname, 
  t.uname as toname,
  l.subject,  t.email as toemail 
FROM letters as l JOIN passport as f ON l.user_id = f.id
JOIN passport as t ON l.for_user = t.id
WHERE l.readmess='0' AND l.rep_send = '0' AND t.rep_mess='1'

тогда если и будет нагружать, то уж точно не запрос, а сама отправка писем.

   
 
 автор: kis-kis   (10.01.2007 в 19:30)   письмо автору
 
   для: Trianon   (09.01.2007 в 23:34)
 

Спасибо. Очень благодарен за оказанную помощь...

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования