| imho.ws |
![]() |
|
|
|
# 1 |
|
Full Member
Регистрация: 05.02.2002
Адрес: Underground
Сообщения: 2 110
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
Еще один вопрос...
Допустим, я на PHP задал такой запрос в MYSQL
$table = query("SELECT username,realname FROM user "); Теперь, требуется следующее: Если поле realname пусто строки пусто, ее нужно сортировать по username. Если же оно не пусто, то эту строку нужно сортировать по realname... Каждую из строк по отдельности. Это технически невыполнимо? Впрочем, можно наверно сделать так: $i = 0; while ($theuser = mysql_fetch_array($table)) { if ($theuser[realname] != "") { $thefullname = $theuser[realname].$theuser[username]; } else { $thefullname = $theuser[username]; } $result[$i] = $thefullname; $i++; } А дальше - отсортировать получившийся массив по алфавиту? Или это большая нагрузка на сервер и лучше просто сделать дополнительное поле в базе данных (combinedname) и обновлять его при редактировании пользователем своего профиля? Последний раз редактировалось Neo; 17.08.2004 в 17:37. |
|
|
|
|
# 2 |
|
мод
IMHO Кодер-200(6,7,8) Регистрация: 29.03.2003
Адрес: Saint-Petersburg, Russia
Пол: Male
Сообщения: 2 734
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
$table = query("SELECT username,realname FROM user order by realname, username");
__________________
Я делаю Линукс! Присоединяйтесь к свободным людям! Связаться со мной всегда можно по джабберу: Hubbitus@jabber.ru Pahan-Hubbitus. |
|
|
|
|
# 3 |
|
Full Member
Регистрация: 05.02.2002
Адрес: Underground
Сообщения: 2 110
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
Hubbitus
Вы меня не совсем поняли... Дело в том, что нет гарантии, что поле realname не является пустым. Поэтому мне нужно, чтобы: если (не пусто(realname)) { результат row = сортировка В ОБЩЕМ СПИСКЕ по(realname.username) } в противном случае { результат row = сортировка В ОБЩЕМ СПИСКЕ по(username) } Зачем? Да вот: Есть таблица со следующим списком людей: Username | Realname Vasya | Василий Петрович Francis | Эдуард Крутой Анна | [пустая запись] Петя | Владимир Коровин Мне нужно, чтобы результат сортировки был следующим: Анна Василий Петрович (Vasya) Владимир Коровин (Петя) Эдуард Крутой (Francis) Теперь понятно? А ваш запрос выдает мне сначала всех юзер с английсим ником, дальше всех с русским ником, а дальше то же самое - но юзеров и с ником, и с именем...... ![]() Т.е сначала идут всем без имени, сортируясь по нику, а дальше все, кто имеют и ник, и имя, сортируясь по имени. Последний раз редактировалось Neo; 17.08.2004 в 21:40. |
|
|
|
|
# 5 | |
|
::VIP::
Регистрация: 27.01.2004
Адрес: Россия. Барнаул
Пол: Male
Сообщения: 417
![]() ![]() ![]() |
Цитата:
__________________
Nunc est bibendum |
|
|
|
|
|
# 8 | |
|
Full Member
Регистрация: 05.02.2002
Адрес: Underground
Сообщения: 2 110
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
is_absent
Нет, это не работает. Синтаксис: Цитата:
ifnull(concat(realname, ' ', username), username); Мне оно возвращает таким образом правильный результат, который мне и был нужен Хотя не совсем ясно, почему.Наверное, еще (в принципе) можно сделать так: IF(A,B,C) Если A истина (!= 0 and != NULL), то вернет B, иначе вернет C. IF(realname!=NULL, concat(realname, ' ', username), username) ? |
|
|
|
|
|
# 10 |
|
Full Member
Регистрация: 05.02.2002
Адрес: Underground
Сообщения: 2 110
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
А оно не работает...
Вернее работает не правильно. Смотри тут, и обрати внимание на алфавит: -- Запрос такой: SELECT DISTINCT a.userid, u.username, u.realname FROM articles a, user u WHERE a.secid='".$_GET['secid']."' AND a.userid = u.userid ORDER BY IF(u.realname!=NULL,u.realname,u.username) ASC Видно они сортируются по установленному первой записью значению... Зайдите на страницу, и посмотрите сверху на результаты print_r... юзер с наименьшим userid не имеет realname, в результате все сортируются по username... А нужно, чтобы для каждой записи сортировка шла отделно.. ![]() S.O.S! Последний раз редактировалось Psionic Vision; 29.12.2007 в 20:20. |
|
|
|
|
# 11 |
|
::VIP::
Регистрация: 27.01.2004
Адрес: Россия. Барнаул
Пол: Male
Сообщения: 417
![]() ![]() ![]() |
IF(realname is NULL, username, concat(realname, ' ', username))
offtop: чего-то я совсем плохой стал. спать чаще надо ![]() проверку на NULL нужно делать оператором is. Остальные операторы сравнения (>, <, !=, = и т.п.) всегда возвращают false.
__________________
Nunc est bibendum |
|
|
|
|
# 13 |
|
::VIP::
Регистрация: 27.01.2004
Адрес: Россия. Барнаул
Пол: Male
Сообщения: 417
![]() ![]() ![]() |
Запрос работает правильно (по карйней мере на твоих данных).
Проверь кодировку базы данных и кодировку, в которой ты кладешь данные. Надо, чтобы они совпадали . Вполне возможно, что твои данные хранятся в cp1251, а база данных хранит их в koi-8. Тогда действительно результат будет такой, как ты описал.
__________________
Nunc est bibendum |
|
|
|
|
# 14 | |
|
Full Member
Регистрация: 05.02.2002
Адрес: Underground
Сообщения: 2 110
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
is_absent
Я решил вопрос простым добавлением нового поля в таблицу пользвоателей. НО: Цитата:
|
|
|
|
|
|
# 15 | |
|
::VIP::
Регистрация: 27.01.2004
Адрес: Россия. Барнаул
Пол: Male
Сообщения: 417
![]() ![]() ![]() |
Neo
вот эти запросы: Код:
select if (realname is null, username, concat(realname, ' (', username, ')')) fullname
from t3
order by fullname
Код:
select if (realname is null, username, concat(realname, ' (', username, ')')) fullname
from t3
order by if(realname is null, username, concat(realname, username))
Цитата:
__________________
Nunc est bibendum |
|
|
|
|
|
# 16 |
|
мод
IMHO Кодер-200(6,7,8) Регистрация: 29.03.2003
Адрес: Saint-Petersburg, Russia
Пол: Male
Сообщения: 2 734
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
У меня есть подобная проблемка:
есть таблица: id | reply_to | +---+---------+ | 6 | 0 | | 7 | 0 | | 8 | 0 | | 9 | 0 | | 10 | 7 | | 11 | 10 | Каким запросом ее можно выбрать в следующем порядке: id | reply_to | +---+---------+ | 6 | 0 | | 7 | 0 | | 10 | 7 | | 11 | 10 | | 8 | 0 | | 9 | 0 | Тоесть, если есть reply_to равный id, чтобы он шел бы за ним...?
__________________
Я делаю Линукс! Присоединяйтесь к свободным людям! Связаться со мной всегда можно по джабберу: Hubbitus@jabber.ru Pahan-Hubbitus. |
|
|
|
|
# 17 |
|
::VIP::
Регистрация: 27.01.2004
Адрес: Россия. Барнаул
Пол: Male
Сообщения: 417
![]() ![]() ![]() |
Hubbitus
если в таблице есть значение поля id равное значению reply_to в текущей строке, то нужно чтобы эта строка была под той строкой содержащей id? Грубо говоря развернуть дерево ответов? если вложенность произвольная -- не получится (нужны иерархические запросы). если же вложенность фиксированная - то можно попробовать.
__________________
Nunc est bibendum |
|
|
|
|
# 18 |
|
мод
IMHO Кодер-200(6,7,8) Регистрация: 29.03.2003
Адрес: Saint-Petersburg, Russia
Пол: Male
Сообщения: 2 734
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
Именно развернуть дерево, чтобы не делать N запросов по числу id....
Как подобная задача "правильно" решается, кто-то вкурсе?
__________________
Я делаю Линукс! Присоединяйтесь к свободным людям! Связаться со мной всегда можно по джабберу: Hubbitus@jabber.ru Pahan-Hubbitus. |
|
|
|
|
# 19 |
|
Full Member
Регистрация: 05.02.2002
Адрес: Underground
Сообщения: 2 110
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
is_absent
Я не знаю. Если я в phpmyadmin выбираю кодировку win-1251, то я весь русский текст спокойно вижу в правильном виде. Сайт вроде тоже в win 1251... по крайней мере, в htaccess я это прописал. Где это еще меняется? |
|
|
|
|
# 20 |
|
::VIP::
Регистрация: 27.01.2004
Адрес: Россия. Барнаул
Пол: Male
Сообщения: 417
![]() ![]() ![]() |
Hubbitus
_http://detail.phpclub.net/article/db_tree на мой взгяд описанная идея реализации наиболее удобна для MySQL. Neo кодировку базы данных хранит переменная сharacter_set. посмотреть ее можно show variables like 'character_set%'. Но проблема похоже не в этом. Проверил на трех разных кодировках -- результат такой, как ты просил.
__________________
Nunc est bibendum |
|
|