Тонкая выборка по алфавиту из БД

K_www

Guest
Тонкая выборка по алфавиту из БД

Помогите начинающему.

Есть таблица с данными id, surname, name

Нужно вывести записи в таком порядке.

А

Алексеев Степан
Афанасьев Иван

В

Васильев Геннадий

Г
Если на «Г» фамилий нет, то здесь должно быть пусто, и сразу за «В» идёт «Д»

Д

Дмитриева Светлана


Как это лучше сделать.

У меня в данный момент решение в таком плане

$au = "SELECT DISTINCT * FROM table WHERE surname LIKE 'А%'";
$bu = "SELECT DISTINCT * FROM table WHERE surname LIKE 'Б%'";

………………………………………
………………………………………
………………………………………

$au = mysql_query($au);
if ($a !== "")
{
echo "<td align=\"left\" width=\"90%\" valign=\"top\"><font class=series><b>А</b></font><br />";

while($au = mysql_fetch_array($a))
{
$name=stripslashes($au['name']);
$surname=stripslashes($au['surname']);
$surname_name = "$surname, $name";

echo "<a href=index.php? id=".$au['id']." ><b>$surname </b></a><br /><br />";

}
}

$ bu = mysql_query($bu);
if ($b !== "")
{
echo "<td align=\"left\" width=\"90%\" valign=\"top\"><font class=series><b>Б</b></font><br />";

while($au = mysql_fetch_array($a))
{
$name=stripslashes($au['name']);
$surname=stripslashes($au['surname']);
$surname_name = "$surname, $name";

echo "<a href=index.php? id=".$au['id']." ><b>$surname </b></a><br /><br />";

}
}


Как сделать, что если на П или Ч фамилии нет, то и этот блок не выводился соответственно.

Спасибо.
 

baev

‹°°¬•
Команда форума
Показывайте реальный код: тут бред сплошной, и непонятно -- что же именно Вы хотите переделать.
 

K_www

Guest
Автор оригинала: baev
Показывайте реальный код: тут бред сплошной, и непонятно -- что же именно Вы хотите переделать.
Просто нужно вывести фамилии в алфавитном порядке,
разбив этот список на блоки по признаку первой буквы алфавите, предварительно оформив этот список первыми буквами

То есть, к пимеру.

А //Выводим все фамилии начинающиеся на "А"
Андронов Иван
Афанасьева Анастасия

Б //Выводим все фамилии начинающиеся на "Б"
Борисов Генадий

В //Если на "В" нет фамили то буква "В" вообще не показывается и далее выводиться список на ту бугву на которую есть данные.

Е //Выводим все фамилии начинающиеся на "Е"
Егорова Светлана

-~{}~ 06.10.05 05:41:

Можно всё это вывести в одном запросе, чтоб не лепить такой бред, каторый приведён выше?
 

K_www

Guest
Автор оригинала: baev
Бред -- в том, что код Вы привели нерабочий.
Покажите как у Вас в действительности сделано.
Я сделал это так, для каждой буквы отдельный запрос

$bu = "SELECT DISTINCT * FROM table WHERE surname LIKE 'Б%'";

$ bu = mysql_query($bu);
if ($b !== "")
{
echo "<b>Б</b><br />";

while($wt = mysql_fetch_array($b))
{

echo " ".stripslashes($wt['surname'])." ".stripslashes($wt['name'])." ";

}
}

Вот и спрашиваю можно по проще сделать, одним запросом

-~{}~ 06.10.05 08:23:

Этот код многократно повторяется, меняется только LIKE 'первая буква%'
 

Bambuk

Новичок
Можно.
Выбираешь из таблицы все нужные тебе записи, сортируя их по полю surname.
Заводишь в php строковую переменную (например, first_letter). Выводишь в цикле строки из запроса. Если первая буква поля surname не равна first_letter, присваивай её first_letter и выводи.
Выводишь surname.
Алгоритм простейший.
 

ScableR

Guest
Можно много способов придумать, тот который использовал автор топика черезсчур громоздкий (можно было хотя бы запрятать всё в функции - что бы не вызывать по сто раз одно и то же)
Лично передо мной стоит примерно такая задача, но одно из решений её я для себя поставил таким вот образом (пример в пару раз понятней чем у "простейший" алгоритм Bambukа):

1) Составляем массив с буквами по которым надо пройтись
2) Пускаем цикл по буквам
3) в цикле делаем выборку из БД ипользуя не LIKE, а LEFT(Fam, 1) = букве по которой проходится цикл, и выводим данные на страницу

Так же стоит проверять какая вернулась строка после запроса - если пустая, то ничего не выводим и идём дальше. Или заранее зная можно исключить эти буквы из массива.
Конечно это описано лишь на словах и данный мой пример не претендует на звание лучшего, но уж какой есть :)
 
Сверху