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

Форум MySQL

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

 

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

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

тема: Извлечь пользователей с днями рождения в ближайшие три дня
 
 автор: urii   (13.06.2011 в 14:35)   письмо автору
5.4 Кб
 
 

В базе у меня есть таблица data:
Таблицу прикрепил
Помогите пожалуйста сделать запрос к базе чтобы отображение запроса имело вид:

Vasya - 12 декабря
Pety - 10 октября

И если в базе 100 имен с разными днями рождения и года, а вынуть имена надо за 3(три) дня, т.е. сегодня, завтра и послезавтра.

  Ответить  
 
 автор: cheops   (13.06.2011 в 15:01)   письмо автору
 
   для: urii   (13.06.2011 в 14:35)
 

Можно начать отталкиваться от запроса
SELECT * FROM `data`
WHERE dr >= NOW() AND dr <= NOW() + INTERVAL 2 DAY

PS Форматирование даты хотите именно в запросе осуществить? Просто с русскими именами месяцев могут быть проблемы, которые придется решать многотабличным запросом. Если нужно, сделаем, но потеряете в скорости, возможно форматирование на стороне клиента будет более эффективно (если это вызывает проблемы, тоже поможем).

  Ответить  
 
 автор: urii   (13.06.2011 в 15:16)   письмо автору
 
   для: cheops   (13.06.2011 в 15:01)
 

Спасибо за быстрый ответ.
Да, форматирование даты я хотел в запросе осуществить. У меня есть свой вариант, он работает, но не корректно. Во первых не все дни из базы выходят и даже те дни которая база выдает с изменением количества дней (скажем меняю с 3 дней на 5) тоже не все дни отображаются, даже те которые отображались уже могут не отображаться.
Вот мой код:
    <?php 
$month
="июня";
$res2 mysql_query("SELECT name, right(dr,2)as month FROM data  WHERE (DATE_FORMAT(dr,'%m %d') >=
DATE_FORMAT(NOW(),'%m %d')) AND (DATE_FORMAT(dr,'%m %d') 
< DATE_FORMAT(DATE_ADD(NOW(),INTERVAL 4 DAY), '%m %d' )) ORDER BY name;"
);
if (
mysql_num_rows($res2) > 0)
{
while(
$name mysql_fetch_array($res2))
{echo 
"&nbsp;&nbsp;<em>".$name['month' ].$month</em><span style='font:13px Verdana, Arial, Helvetica, sans-serif;>&nbsp;&nbsp;".$name['name']."<br></span>"; }}
?>

  Ответить  
 
 автор: cheops   (13.06.2011 в 16:36)   письмо автору
 
   для: urii   (13.06.2011 в 15:16)
 

Для удобства создайте таблицу с русскими названиями месяцев
CREATE TABLE monthes (
  id int(11) NOT NULL,
  `name` tinytext NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;
INSERT INTO monthes VALUES(1, 'января');
INSERT INTO monthes VALUES(2, 'февраля');
INSERT INTO monthes VALUES(3, 'марта');
INSERT INTO monthes VALUES(4, 'апреля');
INSERT INTO monthes VALUES(5, 'мая');
INSERT INTO monthes VALUES(6, 'июня');
INSERT INTO monthes VALUES(7, 'июля');
INSERT INTO monthes VALUES(8, 'августа');
INSERT INTO monthes VALUES(9, 'сентября');
INSERT INTO monthes VALUES(10, 'октября');
INSERT INTO monthes VALUES(11, 'ноября');
INSERT INTO monthes VALUES(12, 'декабря');

Тогда конечный запрос может выглядеть следующим образом
SELECT
  `data`.id AS id,
  `data`.name AS name,
   CONCAT(DAYOFMONTH(`data`.dr), " ", monthes.name) AS data
FROM
  `data`
LEFT JOIN
  monthes
ON
  MONTH(`data`.dr) = monthes.id
WHERE
  dr >= DATE(NOW()) AND
  dr <= DATE(NOW() + INTERVAL 2 DAY)
ORDER BY name

  Ответить  
 
 автор: urii   (13.06.2011 в 17:05)   письмо автору
 
   для: cheops   (13.06.2011 в 16:36)
 

Таблицу с русскими названиями месяцев я вставил, но браузер выдает parse error на строке конца запроса (ORDER BY name;");). Может я не правильно запрос делаю??? Вот запрос и echo запроса.

<?php 
$res2 
mysql_query("SELECT
  'data'.id AS id,
  'data'.name AS name,
   CONCAT(DAYOFMONTH('data'.dr), " ", monthes.name) AS data
FROM
  'data'
LEFT JOIN
  monthes
ON
  MONTH('data'.dr) = monthes.id
WHERE
  dr >= DATE(NOW()) AND
  dr <= DATE(NOW() + INTERVAL 2 DAY)
ORDER BY name;"
);
if (
mysql_num_rows($res2) > 0)
{
while(
$name mysql_fetch_array($res2))
{echo 
$name['id']."&nbsp;".$name['name']."&nbsp;&nbsp;—&nbsp;&nbsp;".$name['dr'];}}
?>

  Ответить  
 
 автор: cheops   (13.06.2011 в 18:34)   письмо автору
 
   для: urii   (13.06.2011 в 17:05)
 

Вы двойные кавычки используете внутри других двойных кавычек - их нужно исправить либо на одиночные, либо экранировать.
<?php  
$res2 
mysql_query("SELECT 
  `data`.id AS id, 
  `data`.name AS name, 
   CONCAT(DAYOFMONTH(`data`.dr), ' ', monthes.name) AS data 
FROM 
  `data` 
LEFT JOIN 
  monthes 
ON 
  MONTH(`data`.dr) = monthes.id 
WHERE 
  dr >= DATE(NOW()) AND 
  dr <= DATE(NOW() + INTERVAL 2 DAY) 
ORDER BY name;"
); 
if (
mysql_num_rows($res2) > 0

  while(
$name mysql_fetch_array($res2)) 
  {
    echo 
$name['id']."&nbsp;".$name['name']."&nbsp;&nbsp;—&nbsp;&nbsp;".$name['dr'];
  }

?>

  Ответить  
 
 автор: urii   (13.06.2011 в 19:14)   письмо автору
 
   для: cheops   (13.06.2011 в 18:34)
 

Мне уже неудобно, но ошибка исчезла, а выборки с базы нет. Этот код дает выборку:
    <?php 

$month
="июня";
$res2 mysql_query("SELECT name, right(dr,2)as month FROM data  WHERE (DATE_FORMAT(dr,'%m %d') >= 
DATE_FORMAT(NOW(),'%m %d')) AND (DATE_FORMAT(dr,'%m %d') 
< DATE_FORMAT(DATE_ADD(NOW(),INTERVAL 2 DAY), '%m %d' )) ORDER BY name;"
);
if (
mysql_num_rows($res2) > 0)
{
while(
$name mysql_fetch_array($res2))
{echo 
"&nbsp;&nbsp;<em>".$name['month' ].$month</em><span style='font:13px Verdana, Arial, Helvetica, sans-serif;>&nbsp;&nbsp;".$name['name']."&nbsp;<br></span>"; }}
?>


но как я писал - некорректно.

  Ответить  
 
 автор: cheops   (13.06.2011 в 19:46)   письмо автору
 
   для: urii   (13.06.2011 в 19:14)
 

1. Вы сначала его в phpMyAdmin прогоните - он у вас корректно выполняется там или нет?
2. Кроме того, нужно обязательно проверять запрос на корректность после выполнения mysql_query()
if(!$res2) exit("Ошибка выполнения запроса - ".mysql_error())
3. Кроме того я заметил вы исправили обратные кавычки ` на одиночные ' - это не правильно, нужно оставить обратные там, где они обрамляют имена вроде data.

  Ответить  
 
 автор: urii   (13.06.2011 в 20:06)   письмо автору
42.7 Кб
 
   для: cheops   (13.06.2011 в 19:46)
 

cheops! Вот таблица (прикрепил), вот код с корректностью после выполнения mysql_query():

<?php  
$res2 
mysql_query("SELECT 
  `data`.id AS id, 
  `data`.name AS name, 
   CONCAT(DAYOFMONTH(`data`.dr), ' ', monthes.name) AS data 
FROM 
  `data` 
LEFT JOIN 
  monthes 
ON 
  MONTH(`data`.dr) = monthes.id 
WHERE 
  dr >= DATE(NOW()) AND 
  dr <= DATE(NOW() + INTERVAL 2 DAY) 
ORDER BY name;"
); 
if(!
$res2) {exit("Ошибка выполнения запроса - ".mysql_error());}
if (
mysql_num_rows($res2) > 0

  while(
$name mysql_fetch_array($res2)) 
  {
    echo 
$name['id']."&nbsp;".$name['name']."&nbsp;&nbsp;—&nbsp;&nbsp;".$name['dr'];
  }


?>

убедитесь сами что выборка не идет.

  Ответить  
 
 автор: cheops   (13.06.2011 в 20:49)   письмо автору
 
   для: urii   (13.06.2011 в 20:06)
 

Есть такое дело, тестовая таблица с текущими датами подвела - надо было от вашего запроса отталкиваться. Попробуйте этот вариант, на ваших данных мне выдалось 9 человек с днями рождения с 13 по 15 июня
SELECT  
  `data`.id AS id,  
  `data`.name AS name,  
   CONCAT(DAYOFMONTH(`data`.dr), ' ', monthes.name) AS data  
FROM  
  `data`  
LEFT JOIN  
  monthes  
ON  
  MONTH(`data`.dr) = monthes.id  
WHERE  
  DATE_FORMAT(dr, '%m-%d') >= DATE_FORMAT(DATE(NOW()), '%m-%d') AND  
  DATE_FORMAT(dr, '%m-%d') <= DATE_FORMAT(DATE(NOW() + INTERVAL 2 DAY), '%m-%d')  
ORDER BY name;

  Ответить  
 
 автор: urii   (13.06.2011 в 21:46)   письмо автору
 
   для: cheops   (13.06.2011 в 20:49)
 

Отлично. Все пошло. Спасибо Вам большое!!!!

  Ответить  
Rambler's Top100
вверх

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