2013-05-24 2 views
0

У меня есть следующий запрос:Результаты запроса заказа по части текста ода колонки

SELECT t.*, c.alias as calias FROM jos2_tabs t 
     JOIN jos2_tabs_category c on c.id=t.category_id 
     WHERE (category_id = 43 
        OR category_id in (select id from jos2_tabs_category WHERE parentid = 43) 
        ) AND state=1 
     ORDER BY ordering2 

И это работает, как ожидалось. Но в таблице «tabs» у меня есть столбец «термины», который содержит даты в текстовом формате (каждый в новой строке). Пример:

18.05.2013-21.07.2013 
22.05.2013-20.06.2013 
01.06.2013-25.08.2013 
15.06.2013-25.08.2013 
06.07.2013-29.09.2013 
20.07.2013-29.09.2013 
17.08.2013-10.11.2013 
31.08.2013-10.11.2013 
03.09.2013-30.09.2013 

Что мне нужно сделать, это изменить запрос к элементам заказа по датам в столбце "terms". Итак, я хочу получить строки, которые ближе всего к текущему времени (может быть только первая строка (первая дата). Любые идеи, как я могу это достичь?

Мне нужно разбить первую строку в ячейке «условия» на from-> для пар и затем отсортировать все строки по «с датами»

+0

почему бы у хранить дату как строку, если вы храните на DateTime (временная метка), или использовать Int (и отдельные даты от времени), уль получить лучшие результаты (efficiany мудры), и ваша проблема исчезнет, ​​как Что ж. – yaron

+0

похоже, что у вас есть две даты как диапазон в столбце varchar, правильно? – Drew

ответ

1

Вы можете смешать Сортировка с STR_TO_DATE() и SUBSTR()

Как пользоваться:

SELECT t.*, c.alias as calias FROM jos2_tabs t 
JOIN jos2_tabs_category c on c.id=t.category_id 
WHERE (category_id = 43 
      OR category_id in (select id from jos2_tabs_category WHERE parentid = 43) 
      ) AND state=1 
ORDER BY STR_TO_DATE(SUBSTR(terms, 0, 10),'%d.%m.%Y') ASC 
+0

Это работает! Спасибо. Вы знаете, как ограничить результаты только датами> СЕЙЧАС? – PsychoX

+0

, вы можете использовать эту функцию с 'HAVING', например' HAVING STR_TO_DATE (SUBSTR (термины, 0, 10)), '% d.% m.% Y')> NOW() ' – Robert

+0

Но я не могу использовать ORDER BY HAVING ... могу я? – PsychoX

0

использования select replace(terms,'.','-') from your_table WHERE 1 вы получите 18.05.2013 к 18-05-2013.

Теперь, вы можете изменить его пойти получить желаемый результат.

+0

И знаете ли вы, как я могу упорядочить строки с первого по дате в каждой строке? – PsychoX

1

Если вы заказываете результат по дате вы должны это сделать:

ORDER BY DATE(columnname) DESC 
1

Попробуйте вместе с ней

SELECT t.*, c.alias as calias FROM jos2_tabs t 
    JOIN jos2_tabs_category c on c.id=t.category_id 
    WHERE (category_id = 43 
       OR category_id in (select id from jos2_tabs_category WHERE parentid = 43) 
       ) AND state=1   

И вы получите все строки без заказа, то

foreach($rows as $key=>row) 
{ 
    $my_date = explode('-',$row['terms']); 
    $from = $my_date[0]; 
    $to = $my_date[1]; 
    $order_arr[$key] = strtotime($from); 
} 
array_multisort($order_arr, SORT_ASC, $rows); 
print_r($rows); 

Вы получите заслуживал

+0

Но у меня есть несколько от-до дат в одной ячейке. И заказ DATE (whole_cell) не будет работать :( – PsychoX

+0

О, я не думал об этом ... но я думаю, что хранить от до дат в одном столбце - это не лучшая идея любой ценой – Gautam3164

+0

Да. Я знаю, что это не очень хорошая идея ... но я этого не создал ... Моя задача - изменить этот запрос, и это не так просто :( – PsychoX

Смежные вопросы