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

Форум MySQL

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

 

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

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

тема: Сложная сортировка
 
 автор: mtxd   (22.09.2008 в 11:25)   письмо автору
 
 

В зависимости от установленных галочек собирается условие, и генерируется запрос:

    // collect where array and implode, if possible
    $where = (is_array($where) ? "WHERE " . implode(' AND ', $where) : "");
    
    // query itself
    $cmd = "SELECT *
            FROM `$ads->t_ads`
            $where
            ORDER BY `$ads->f_adtype` ASC, `$ads->f_reg` ASC;";

Сортируется по типу (1, 2, 3...) и потом каждая группа сортируется по рег. номеру. Получаем
1, 3098, a_text
1, 3099, z_text
1, 4000, b_text
2, 1029, t_text
2, 1039, c_text

и так далее.

Можно ли изменить запрос таким образом, чтобы строки, имеющие id=1, сортировались по тексту, а все остальные по рег. номеру? Одним запросом. UNION, конечно, вариант, но в данном случае запрос собирается динамически. Видел несколько примеров ORDER BY IF(), но не ясно как он работает.

  Ответить  
 
 автор: Trianon   (22.09.2008 в 13:35)   письмо автору
 
   для: mtxd   (22.09.2008 в 11:25)
 

С чем затруднения?
С правильным SQL-запрсом?
Или с php-кодом, который его сформирует?

Если первое, то где структура таблицы?
Если второе, то какой SQL-запрос Вы хотите получить на выходе?

Обе задачи разом не решают.

  Ответить  
 
 автор: mtxd   (22.09.2008 в 15:16)   письмо автору
 
   для: Trianon   (22.09.2008 в 13:35)
 

В данном виде ни с запросом, ни с кодом проблем нет.
Структура, в упрощенном виде, приведена выше: adtype|reg|text, с другими полями в этом запросе я не работаю.
Нужен такой запрос, чтобы при выборке, если adtype=1, значения сортировались по тексту, все остальные по reg.

Вывод на данный момент:
1, 3098, a_text
1, 3099, z_text
1, 4000, b_text

2, 1029, t_text
2, 1039, c_text

Мне нужно:
1, 3098, a_text
1, 4000, b_text
1, 3099, z_text

2, 1029, t_text
2, 1039, c_text

Учитывая, что запрос может иметь и такой вид:
SELECT * FROM `ads` WHERE `tv1` = '1' AND `adtype` = '2' AND `id_start` <= '713' AND `id_stop` > '713' AND `lt` = '0' ORDER BY `adtype` ASC, `reg` ASC;
и просто такой:
SELECT * FROM `ads` WHERE `id_start` <= '714' AND `id_stop` > '714' ORDER BY `adtype` ASC, `reg` ASC;

То есть, запросить могут и все adtype'ы, и только 1, или только 2 и т.п. так как $where собирается из нескольких условий, типа:


    // WHERE condition for ad types, (1, 2, 3...)
    if (!empty($_REQUEST['adtype'])) {
        $where[] = "`$ads->f_adtype` = '$_REQUEST[adtype]'";
    }

    // WHERE condition for week
    if (!empty($_REQUEST['week'])) {
        // count unique paper id
        $week = $_REQUEST['week'];
        $year = date("Y", strtotime("now"));
        $id = $ads->get_newspaper_id($year, $week);
        $where[] = "`$ads->f_id_start` <= '$id' AND `$ads->f_id_stop` > '$id'";
    }

    // WHERE condition for comment
    $comment = trim($_REQUEST['comment']);
    if (!empty($comment)) {
        $where[] = "$ads->f_comment LIKE '%$_REQUEST[comment]%'";
    }

  Ответить  
 
 автор: Trianon   (22.09.2008 в 17:19)   письмо автору
 
   для: mtxd   (22.09.2008 в 15:16)
 

>Нужен такой запрос, чтобы при выборке, если adtype=1, значения сортировались по тексту, все остальные по reg.

ORDER BY IF(adtype=1, text, reg)

  Ответить  
 
 автор: mtxd   (22.09.2008 в 17:32)   письмо автору
 
   для: Trianon   (22.09.2008 в 17:19)
 

Все гениальное - просто. Благодарен.
А есть man по ORDER IF()? Можно добавлять несколько таких условий?

  Ответить  
 
 автор: Trianon   (22.09.2008 в 19:23)   письмо автору
 
   для: mtxd   (22.09.2008 в 17:32)
 

Есть ман по ORDER BY

Выражений, которые задают порядок, может быть несколько.

И есть ман по IF()
Выражение может (в частном случае) быть результатом функции IF()

  Ответить  
 
 автор: mtxd   (25.09.2008 в 12:10)   письмо автору
 
   для: Trianon   (22.09.2008 в 17:19)
 

Можно к данному условию применить натуральную сортировку, типа ORDER BY IF(adtype=1, text, reg+0), а так же ASC, DESC и т.п. ?

  Ответить  
 
 автор: mtxd   (30.09.2008 в 17:43)   письмо автору
 
   для: mtxd   (25.09.2008 в 12:10)
 

И все же, возможны ли дополнительные условия сортировки?

  Ответить  
 
 автор: Trianon   (30.09.2008 в 18:32)   письмо автору
 
   для: mtxd   (30.09.2008 в 17:43)
 

Если Вы захотите сортировать по текстовым полям в разные стороны в зависимости от условия - тогда врядли. А в остальном - да, возможны.
Модификаторы ASC и DESC ставятся после каждого (из списка) выражения, задающего сортировку.

  Ответить  
 
 автор: mtxd   (01.10.2008 в 09:50)   письмо автору
 
   для: Trianon   (30.09.2008 в 18:32)
 

А каким образом с данным условием выполнить натуральную сортировку по reg? И как, в случае необходимости, сортировать ASC или DESC?

P.S. В моем случае помогает ORDER BY IF(adtype=1, text, reg+1000), но все же интересно про ASC и DESC.

  Ответить  
 
 автор: Trianon   (01.10.2008 в 09:55)   письмо автору
 
   для: mtxd   (01.10.2008 в 09:50)
 

Я не знаю такого понятия "натуральная сортировка"

  Ответить  
 
 автор: mtxd   (01.10.2008 в 11:03)   письмо автору
 
   для: Trianon   (01.10.2008 в 09:55)
 

Это когда
1
2
3
12
24

А не
1
12
2
24
3

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

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