IMHO.WS

IMHO.WS (https://www.imho.ws/index.php)
-   Веб-программирование (https://www.imho.ws/forumdisplay.php?f=29)
-   -   Еще один вопрос... (https://www.imho.ws/showthread.php?t=66444)

Psionic Vision 17.08.2004 17:34

Еще один вопрос...
 
Допустим, я на 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) и обновлять его при редактировании пользователем своего профиля?

Hubbitus 17.08.2004 21:03

$table = query("SELECT username,realname FROM user order by realname, username");

Psionic Vision 17.08.2004 21:27

Hubbitus
Вы меня не совсем поняли... Дело в том, что нет гарантии, что поле realname не является пустым.

Поэтому мне нужно, чтобы:

если (не пусто(realname)) {
результат row = сортировка В ОБЩЕМ СПИСКЕ по(realname.username)
} в противном случае {
результат row = сортировка В ОБЩЕМ СПИСКЕ по(username)
}

Зачем?
Да вот:

Есть таблица со следующим списком людей:
Username | Realname

Vasya | Василий Петрович
Francis | Эдуард Крутой
Анна | [пустая запись]
Петя | Владимир Коровин

Мне нужно, чтобы результат сортировки был следующим:

Анна
Василий Петрович (Vasya)
Владимир Коровин (Петя)
Эдуард Крутой (Francis)

Теперь понятно?

А ваш запрос выдает мне сначала всех юзер с английсим ником, дальше всех с русским ником, а дальше то же самое - но юзеров и с ником, и с именем...... :(

Т.е сначала идут всем без имени, сортируясь по нику, а дальше все, кто имеют и ник, и имя, сортируясь по имени.

RaZEr 18.08.2004 18:52

Neo, за заголовок темы пока предупреждаю устно.

is_absent 18.08.2004 22:45

Цитата:

Neo:
если (не пусто(realname)) {
результат row = сортировка В ОБЩЕМ СПИСКЕ по(realname.username)
} в противном случае {
результат row = сортировка В ОБЩЕМ СПИСКЕ по(username)
}
order by ifnull(realname, concat(realname, ' ', username), username)

Psionic Vision 19.08.2004 17:13

RaZEr
А что не так с заголовком? :confused: Его неинформативность?
Если так - прошу прощения. :beer:

is_absent
Yay!
Именно то что надо. Если оно еще и работает... То совсем хорошо. :) Спасибо.

is_absent 20.08.2004 06:19

упс.. прошу прощения.
ifnull(realname, username, concat(realname, ' ', username))

Psionic Vision 20.08.2004 16:10

is_absent
Нет, это не работает.
Синтаксис:
Цитата:

IFNULL(A,B) Если A не null, вернет A, иначе вернет B.
А значит работает оно так (по крайней мере для меня):

ifnull(concat(realname, ' ', username), username);

Мне оно возвращает таким образом правильный результат, который мне и был нужен :) Хотя не совсем ясно, почему.

Наверное, еще (в принципе) можно сделать так:
IF(A,B,C) Если A истина (!= 0 and != NULL), то вернет B, иначе вернет C.

IF(realname!=NULL, concat(realname, ' ', username), username)

?

is_absent 20.08.2004 21:05

Neo
виноват :) твои оба варианты верны.

Psionic Vision 21.08.2004 04:55

А оно не работает...
Вернее работает не правильно.

Смотри тут, и обрати внимание на алфавит:
--

Запрос такой:
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!

is_absent 21.08.2004 11:49

IF(realname is NULL, username, concat(realname, ' ', username))
offtop: чего-то я совсем плохой стал. спать чаще надо :)
проверку на NULL нужно делать оператором is. Остальные операторы сравнения (>, <, !=, = и т.п.) всегда возвращают false.

Psionic Vision 21.08.2004 16:07

Всего равно не так.
Теперь она сначала сортирует всех без realname по алфавиту, дальше она сортирует всех с realname по алфавиту повторно.... :(

is_absent 23.08.2004 05:41

Запрос работает правильно (по карйней мере на твоих данных).
Проверь кодировку базы данных и кодировку, в которой ты кладешь данные. Надо, чтобы они совпадали :). Вполне возможно, что твои данные хранятся в cp1251, а база данных хранит их в koi-8. Тогда действительно результат будет такой, как ты описал.

Psionic Vision 23.08.2004 06:03

is_absent
Я решил вопрос простым добавлением нового поля в таблицу пользвоателей.
НО:
Цитата:

Вполне возможно, что твои данные хранятся в cp1251, а база данных хранит их в koi-8.
Данные хранятся где? Разве не в базе данных? А база - в кои8. Ничего не понимаю.. :(

is_absent 23.08.2004 06:21

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))

на моих данных (может быть я что-то не учел) работают правильно. Да и по логике получается... может все-таки проблемы с перекодировкой туда-сюда? сайт-то в win-1251 отображается. Я в свое время намучился с этим сильно..

Цитата:

Neo:
Данные хранятся где? Разве не в базе данных? А база - в кои8. Ничего не понимаю..
я хотел сказать, что ты отдаешь данные, в кодировке cp1251, а база данных хранит их в koi8. сортировать она тоже будет в koi8 соответвственно.

Hubbitus 23.08.2004 15:05

У меня есть подобная проблемка:
есть таблица:
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, чтобы он шел бы за ним...?

is_absent 23.08.2004 15:20

Hubbitus
если в таблице есть значение поля id равное значению reply_to в текущей строке, то нужно чтобы эта строка была под той строкой содержащей id?
Грубо говоря развернуть дерево ответов?
если вложенность произвольная -- не получится (нужны иерархические запросы). если же вложенность фиксированная - то можно попробовать.

Hubbitus 23.08.2004 15:54

Именно развернуть дерево, чтобы не делать N запросов по числу id....
Как подобная задача "правильно" решается, кто-то вкурсе?

Psionic Vision 23.08.2004 16:27

is_absent
Я не знаю.
Если я в phpmyadmin выбираю кодировку win-1251, то я весь русский текст спокойно вижу в правильном виде.
Сайт вроде тоже в win 1251... по крайней мере, в htaccess я это прописал.
Где это еще меняется?

is_absent 24.08.2004 05:57

Hubbitus
_http://detail.phpclub.net/article/db_tree
на мой взгяд описанная идея реализации наиболее удобна для MySQL.

Neo
кодировку базы данных хранит переменная сharacter_set. посмотреть ее можно show variables like 'character_set%'. Но проблема похоже не в этом. Проверил на трех разных кодировках -- результат такой, как ты просил.


Часовой пояс GMT +4, время: 03:58.

Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.