|
 5.4 Кб |
|
| В базе у меня есть таблица data:
Таблицу прикрепил
Помогите пожалуйста сделать запрос к базе чтобы отображение запроса имело вид:
Vasya - 12 декабря
Pety - 10 октября
И если в базе 100 имен с разными днями рождения и года, а вынуть имена надо за 3(три) дня, т.е. сегодня, завтра и послезавтра. | |
|
|
|
|
|
|
|
для: urii
(13.06.2011 в 14:35)
| | Можно начать отталкиваться от запроса
SELECT * FROM `data`
WHERE dr >= NOW() AND dr <= NOW() + INTERVAL 2 DAY
|
PS Форматирование даты хотите именно в запросе осуществить? Просто с русскими именами месяцев могут быть проблемы, которые придется решать многотабличным запросом. Если нужно, сделаем, но потеряете в скорости, возможно форматирование на стороне клиента будет более эффективно (если это вызывает проблемы, тоже поможем). | |
|
|
|
|
|
|
|
для: 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 " <em>".$name['month' ]." $month</em><span style='font:13px Verdana, Arial, Helvetica, sans-serif;> ".$name['name']."<br></span>"; }}
?>
|
| |
|
|
|
|
|
|
|
для: 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
|
| |
|
|
|
|
|
|
|
для: 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']." ".$name['name']." — ".$name['dr'];}}
?>
|
| |
|
|
|
|
|
|
|
для: 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']." ".$name['name']." — ".$name['dr'];
}
}
?>
|
| |
|
|
|
|
|
|
|
для: 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 " <em>".$name['month' ]." $month</em><span style='font:13px Verdana, Arial, Helvetica, sans-serif;> ".$name['name']." <br></span>"; }}
?>
|
но как я писал - некорректно. | |
|
|
|
|
|
|
|
для: urii
(13.06.2011 в 19:14)
| | 1. Вы сначала его в phpMyAdmin прогоните - он у вас корректно выполняется там или нет?
2. Кроме того, нужно обязательно проверять запрос на корректность после выполнения mysql_query()
if(!$res2) exit("Ошибка выполнения запроса - ".mysql_error())
| 3. Кроме того я заметил вы исправили обратные кавычки ` на одиночные ' - это не правильно, нужно оставить обратные там, где они обрамляют имена вроде data. | |
|
|
|
|
 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']." ".$name['name']." — ".$name['dr'];
}
}
?>
|
убедитесь сами что выборка не идет. | |
|
|
|
|
|
|
|
для: 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;
|
| |
|
|
|
|
|
|
|
для: cheops
(13.06.2011 в 20:49)
| | Отлично. Все пошло. Спасибо Вам большое!!!! | |
|
|
|