[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Выбока значений по месяцу и дате
RCuPeR
В базе есть следующая запись:
INSERT INTO `exotichoroscopes_data` (`id`, `type`, `zodiac`, `date_begin`, `date_end`, `name`, `other`) VALUES (443, 17, NULL, '0000-03-19', '0000-04-24', 'Пегас', NULL);


Получаю ее следующим запросом:
SELECT `type`, `name` FROM `exotichoroscopes_data` WHERE `type` = 17 AND `date_begin` <= '0000-04-01' AND `date_end` >= '0000-04-01';


Первый запрос:
Где 0000-03-19 начало диапазона дат;
Где 0000-04-24 конец диапазона дат;

Второй запрос:
Где "0000-04-01" - месяц и дата моего рождения.

Т.е., если моя мой месяц и день рождения входит в указанный диапазон дат - ура, мне выведет данные.
Тут все отлично.

Но, появляются проблемы при таких запросах:
INSERT INTO `exotichoroscopes_data` (`id`, `type`, `zodiac`, `date_begin`, `date_end`, `name`, `other`) VALUES (450, 17, NULL, '0000-12-01', '0000-01-07', 'Минотавр', NULL);


SELECT `type`, `name` FROM `exotichoroscopes_data` WHERE `type` = 17 AND `date_begin` <= '0000-12-01' AND `date_end` >= '0000-12-01';



Как вы уже заметили, в первом запросе диапазон следующий:
01 декабря - 07 января.

Выборка происходит по 01-му декабря.
Но не срабатывает. Потому, что диапазон обрывается на 31-м декабре и дальше - следующий год.

Не знаю как возможно решить это проблему. Может, вы чем-то поможете ?
Если не мускулом, так может пыхой что-то подправить...

Вот структура таблицы если нужно:
CREATE TABLE IF NOT EXISTS `exotichoroscopes_data` (
`id` int(4) NOT NULL AUTO_INCREMENT,
`type` int(2) NOT NULL,
`zodiac` int(2) DEFAULT NULL,
`date_begin` date DEFAULT NULL,
`date_end` date DEFAULT NULL,
`name` varchar(200) NOT NULL,
`other` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
)
ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=469 ;




Спустя 2 минуты, 44 секунды (26.01.2012 - 11:31) inpost написал(а):
RCuPeR
Второй запрос - Это ИЛИ smile.gif

Спустя 4 минуты, 34 секунды (26.01.2012 - 11:36) RCuPeR написал(а):
Цитата (inpost @ 26.01.2012 - 08:31)
RCuPeR
Второй запрос - Это ИЛИ :)

Не понял, как "ИЛИ" ?
 WHERE `type` = 17 AND `date_begin` <= '0000-04-01' AND `date_end` >= '0000-04-01'
- тут же AND везде. Или я неверно понял ?

Спустя 5 минут, 48 секунд (26.01.2012 - 11:41) inpost написал(а):
RCuPeR
WHERE `type` = 17 AND (`date_begin` <= '0000-04-01' OR `date_end` >= '0000-04-01')

уже ИЛИ :)

Спустя 12 минут, 45 секунд (26.01.2012 - 11:54) RCuPeR написал(а):
Но, выборка не работает.
Точнее работает, но не корректно.
Выгребает ВСЕ.

Давай иначе:
Свернутый текст
CREATE TABLE IF NOT EXISTS `phpfox_exotichoroscopes_data` (
`id` int(4) NOT NULL AUTO_INCREMENT,
`type` int(2) NOT NULL,
`zodiac` int(2) DEFAULT NULL,
`date_begin` date DEFAULT NULL,
`date_end` date DEFAULT NULL,
`name` varchar(200) NOT NULL,
`other` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
)
ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=469 ;


INSERT INTO `phpfox_exotichoroscopes_data` (`id`, `type`, `zodiac`, `date_begin`, `date_end`, `name`, `other`) VALUES
(441, 17, NULL, '0000-01-08', '0000-02-12', 'Кентавр', NULL),
(
442, 17, NULL, '0000-02-13', '0000-03-18', 'Гарпия', NULL),
(
443, 17, NULL, '0000-03-19', '0000-04-24', 'Пегас', NULL),
(
444, 17, NULL, '0000-04-25', '0000-05-30', 'Цербер', NULL),
(
445, 17, NULL, '0000-05-31', '0000-07-03', 'Сатир', NULL),
(
446, 17, NULL, '0000-07-04', '0000-08-10', 'Сирена', NULL),
(
447, 17, NULL, '0000-08-11', '0000-09-15', 'Грифон', NULL),
(
448, 17, NULL, '0000-09-16', '0000-10-22', 'Химера', NULL),
(
449, 17, NULL, '0000-10-23', '0000-11-30', 'Сфинкс', NULL),
(
450, 17, NULL, '0000-12-01', '0000-01-07', 'Минотавр', NULL);


Вот весь дамп базы.
Из него нужно получить (450, 17, NULL, '0000-12-01', '0000-01-07', 'Минотавр', NULL) эту строку, если моя дата рождения 0000-12-01. Как ?

Спустя 3 минуты, 20 секунд (26.01.2012 - 11:57) inpost написал(а):
От любой даты отнимай 7 дней, получишь исчисление от 01-01 до 12-31. Просто визуальный вид исчисления поменяй, а представление сохрани.

К тому же твоя задача решается с помощью одной колонки `date_end`, вообще smile.gif Как альтернатива

Спустя 6 минут, 20 секунд (26.01.2012 - 12:04) RCuPeR написал(а):
sad.gif
Не понял ничего...

Цитата
От любой даты отнимай 7 дней, получишь исчисление от 01-01 до 12-31. Просто визуальный вид исчисления поменяй, а представление сохрани.

Что мне это даст, не пойму.
Если у меня была дата 0000-01-19, и от нее отниму 7 дней, выйдет 0000-01-12 - не пойму как мне это поможет.

Цитата
К тому же твоя задача решается с помощью одной колонки `date_end`, вообще  Как альтернатива

По-моему, это абсурд. Ведь выборка проходит исходя из диапазона дат.
Т.е, если моя дата рождения входит в нужный диапазон дат - выведи мне `name`, например. Если использовать только `date_end` - я не добьюсь желаемого результата. Ведь не будет определен диапазон.

Спустя 3 минуты, 38 секунд (26.01.2012 - 12:07) inpost написал(а):
01-01 => 01-15
01-16 => 01-28
01-29 => 02-30

Твой день: 01-17

SELECT * FROM `table` WHERE `date_start` <= '01-17' ORDER BY `date_start` DESC LIMIT 1 

Спустя 1 минута, 37 секунд (26.01.2012 - 12:09) inpost написал(а):
Первый знак зодиака будет начинаться с 01-01, а последний заканчиваться 12-31. Всё работает, запрос элементарный.

Спустя 2 минуты, 9 секунд (26.01.2012 - 12:11) RCuPeR написал(а):
Хм... Как я понимаю, в моем случае, это:
SELECT * FROM `phpfox_exotichoroscopes_data` WHERE `type` = 17 AND `date_begin` <= '0000-12-17' ORDER BY `date_begin` DESC LIMIT 1  

Да, выгребло то, что мне нужно. Но, сомневаюсь в точности результата.

Спустя 1 минута, 23 секунды (26.01.2012 - 12:13) inpost написал(а):
RCuPeR
Почему сомневаешься?
Выборка достанет 2 записи:
01-01 и 01-16
Мы поменяли местами и взяли последнюю запись, получили 01-16, итого месяц, который нужен.

Спустя 2 минуты, 18 секунд (26.01.2012 - 12:15) inpost написал(а):
Если не хочешь вообще менять структуру и логику, то продублируй ПОСЛЕДНИЙ ЗНАК ЗОДИАКА, то есть начало у него
01-01 и 12-07

Спустя 2 минуты, 58 секунд (26.01.2012 - 12:18) RCuPeR написал(а):
Да не, думаю, будет правильней если использовать твой запрос:
SELECT * FROM `phpfox_exotichoroscopes_data` WHERE `type` = 17 AND `date_begin` <= '0000-12-17' ORDER BY `date_begin` DESC LIMIT 1;


Буду пробовать, тестить в реальных условиях.
Тему пока не закрывайте.

Спасибо огромное !

Спустя 4 минуты, 57 секунд (26.01.2012 - 12:23) inpost написал(а):
Да-да, мой запрос, только дубль.


_____________
Гнусный социопат с комплексом Бога.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.