А можно ли так делать? Не понятный запрос

crezd

Новичок
А можно ли так делать? Не понятный запрос

Добрый день,


Вот сижу на работе и думаю, можно или нет

например у меня есть дата и число в бд это лежит как одна ячейка текст в таком виде

date1*num1:date2*num2:date3*num3:date3*num3:

например:

10/04/2006*52:12/04/2006*12:14/04/2006*420:16/04/2006*0:


Мне нужно сделать такой запрос:

Покажи даты у которых номер равен нулю

или

Покажи номера по определеной дате, например 14/04/2006


Как это реализовать? Заранее спасибо.
 

ForJest

- свежая кровь
Создать таблицу
num_to_date (id_main_table, num, date)
и хранить аккуратно в столбик.
id_main_table это id из главной таблицы.
 

crezd

Новичок
такая система уже есть, вопрос в том можно ли сделать так как я написал выше
 

vadim

Guest
crezd
Можно выбирать с помощью LIKE и потом парсить номера с помощью ПХП
 

crezd

Новичок
vadim, слишком простой выход и кривой, надо делать всё на уровне запроса


вопров в том, возможно ли?
 

ForJest

- свежая кровь
crezd
Конечно можно. В MySQL есть довольно много строковых функций.
http://dev.mysql.com/doc/refman/4.0/ru/string-functions.html
Можно сделать через LOCATE или REGEX или ещё как.
Можно написать UDF.
http://dev.mysql.com/doc/refman/4.0/ru/adding-functions.html
Или использовать полтотекстовый поиск.
http://dev.mysql.com/doc/refman/4.0/ru/fulltext-search.html
---------------
Т.е. ответ - возможно.
 

crezd

Новичок
ForJest

Спасибо, можете привести пример как это можно осуществить с помощью REGEX?

Заранее спасибо
 

Wicked

Новичок
я так понял из записи типа:

id | stats
1 | 10/04/2006*0:12/04/2006*0:14/04/2006*420:16/04/2006*0:

по запросу "Покажи даты у которых номер равен нулю"

муся должна вернуть примерно такой резалт сет?

id | date | count
1 | 10/04/2006 | 0
1 | 12/04/2006 | 0
1 | 16/04/2006 | 0
 

crezd

Новичок
ForJest
это вроде не тот форум где за такие ответы нужно платить.

Wicked
Да, совершенно верно
 

ForJest

- свежая кровь
crezd
Конечно не тот. Но ты просишь пример не у форума, а у меня. У меня не возбудился интерес решать эту задачу регами, поэтому я предложил тебе вариант.
Но ты не отчаивайся. Кому-то может быть будет интересно решить эту задачу на твоих условиях.
 

Wicked

Новичок
тут уже другие проблемы :)

например, как одну запись разбить на несколько? для этого потребуется или UDF или таблица-итератор (не знаю, как общепринято называть, я называю так).

Вообщем таблица-итератор - таблица с 1 столбцом, которая содержит целые числа от 1 до N (где N - максимальное количество пар дата-значение в твоих строках).

Далее, для этого примера, мы выполняем запрос типа:
select
*,
get_date_from_stats(stats, iterator_num) as date,
get_count_from_stats(stats, iterator_num) as cnt,
from table1
inner join iterator on (iterator.num <= pairs_count(stats) /*количество пар дата значение в данном */)
having cnt = 0;

и вуаля... осталось реализовать псевдо-функции pairs_count, get_date_from_stats, get_count_from_stats :)

я это делал в одном из своих проектов, но не из-за того, что у меня дурацкая архитектура %) так что если не хочешь проблем в работе с этой бд, вернись к посту номер 2.
 

vadim

Guest
>>>слишком простой выход
А чем плох простой выход???
 
Сверху