|
|
|
| В зависимости от установленных галочек собирается условие, и генерируется запрос:
// 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(), но не ясно как он работает. | |
|
|
|
|
|
|
|
для: mtxd
(22.09.2008 в 11:25)
| | С чем затруднения?
С правильным SQL-запрсом?
Или с php-кодом, который его сформирует?
Если первое, то где структура таблицы?
Если второе, то какой SQL-запрос Вы хотите получить на выходе?
Обе задачи разом не решают. | |
|
|
|
|
|
|
|
для: 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]%'";
}
|
| |
|
|
|
|
|
|
|
для: mtxd
(22.09.2008 в 15:16)
| | >Нужен такой запрос, чтобы при выборке, если adtype=1, значения сортировались по тексту, все остальные по reg.
ORDER BY IF(adtype=1, text, reg) | |
|
|
|
|
|
|
|
для: Trianon
(22.09.2008 в 17:19)
| | Все гениальное - просто. Благодарен.
А есть man по ORDER IF()? Можно добавлять несколько таких условий? | |
|
|
|
|
|
|
|
для: mtxd
(22.09.2008 в 17:32)
| | Есть ман по ORDER BY
Выражений, которые задают порядок, может быть несколько.
И есть ман по IF()
Выражение может (в частном случае) быть результатом функции IF() | |
|
|
|
|
|
|
|
для: Trianon
(22.09.2008 в 17:19)
| | Можно к данному условию применить натуральную сортировку, типа ORDER BY IF(adtype=1, text, reg+0), а так же ASC, DESC и т.п. ? | |
|
|
|
|
|
|
|
для: mtxd
(25.09.2008 в 12:10)
| | И все же, возможны ли дополнительные условия сортировки? | |
|
|
|
|
|
|
|
для: mtxd
(30.09.2008 в 17:43)
| | Если Вы захотите сортировать по текстовым полям в разные стороны в зависимости от условия - тогда врядли. А в остальном - да, возможны.
Модификаторы ASC и DESC ставятся после каждого (из списка) выражения, задающего сортировку. | |
|
|
|
|
|
|
|
для: Trianon
(30.09.2008 в 18:32)
| | А каким образом с данным условием выполнить натуральную сортировку по reg? И как, в случае необходимости, сортировать ASC или DESC?
P.S. В моем случае помогает ORDER BY IF(adtype=1, text, reg+1000), но все же интересно про ASC и DESC. | |
|
|
|
|
|
|
|
для: mtxd
(01.10.2008 в 09:50)
| | Я не знаю такого понятия "натуральная сортировка" | |
|
|
|
|
|
|
|
для: Trianon
(01.10.2008 в 09:55)
| | Это когда
1
2
3
12
24
А не
1
12
2
24
3 | |
|
|
|