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

Форум MySQL

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

 

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

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

тема: Снова про сортировку :)
 
 автор: ElWhite   (26.08.2005 в 13:54)   письмо автору
 
 

Подскажите пожалуйста, как отсортировать пользователю общую таблицу по колонкам, полученную из объединения нескольких таблиц MySQL базы?

Вот для наглядности условие объединения:


$query = "
# показываем колонки
select
      veh.VehicType, 
      env.EnvirType, 
      prt.ProtType, 
      sts.StandSizeType,
      fdr.FrontDriveType,  
      trm.TrMarkName, 
      sut.PriceGen, 
      sut.StandGuarant,
      sut.ExpGuarant, 
      sut.FullGuarant,
      sut.Date

# откуда берем эти колонки, т.е. объединяемые таблицы
from
      tyres_summarytable      as    sut,      
      tyres_vehicle           as    veh,
      tyres_environment       as    env,
      tyres_protectortype     as    prt,
      tyres_standardsize      as    sts,
      tyres_frontdrive        as    fdr,
      tyres_trademark         as    trm
      

# условия объединения
where    sut.VehicID  =       veh.VehicID
and      sut.EnvirID  =       env.EnvirID
and      sut.ProtTypeID  =    prt.ProtTypeID
and      sut.StandSizeID  =   sts.StandSizeID
and      sut.FrontDriveID  =  fdr.FrontDriveID
and      sut.TrMarkID  =      trm.TrMarkID

order by sts.StandSizeType
";


Теоретически, наверное, можно указать в order by последовательно сортировку для каждого столбца (колонки) результирующей таблицы и потом через ссылку обратиться к соответствующему условию сортировки, но как это реализовать практически - не знаю.

Подскажите, пожалуйста...

   
 
 автор: cheops   (26.08.2005 в 14:57)   письмо автору
 
   для: ElWhite   (26.08.2005 в 13:54)
 

Не очень понятно, что имеется ввиду - (1) необходимо один раз отсортировать результат по нескольким колонкам, т.е. сначала данные сортируются по одной колонке, если в пределах одного значения первой колокни имеются уникальные значения во второй - то отсортировать их или (2) пользователю необходимо предоставить инструменты, чтобы он мог сортировать результат по первой колонке, по второй колонке и т.д.?

   
 
 автор: ElWhite   (26.08.2005 в 15:51)   письмо автору
 
   для: cheops   (26.08.2005 в 14:57)
 

Да, именно чтобы пользователь мог отсортировать по той колонке, по которой ему удобнее.
Себе осортировать я и сам могу в коде руками :)

   
 
 автор: cheops   (26.08.2005 в 22:38)   письмо автору
 
   для: ElWhite   (26.08.2005 в 15:51)
 

Смысл такой - в шапке таблицы, названия столбцов делают гиперссылками на эту же страницу, но с дополнительным параметром index.php?order=VehicType. Затем проверяется не передано ли странице параметр order, и, если это так, то формируется временная переменная с куском SQL-запроса: "ORDER BY veh.VehicType"
<?php
  $str 
"";
  if(isset(
$_GET['VehicType'])) $str "ORDER BY veh.VehicType";
  if(isset(
$_GET['EnvirType'])) $str "ORDER BY env.EnvirType";
  
// И так для каждого параметра...
?>

Затем это значение подставляется в конечный SQL-запрос
<?php
$query 

select 
      veh.VehicType, 
      env.EnvirType, 
      prt.ProtType, 
      sts.StandSizeType, 
      fdr.FrontDriveType,   
      trm.TrMarkName, 
      sut.PriceGen, 
      sut.StandGuarant, 
      sut.ExpGuarant, 
      sut.FullGuarant, 
      sut.Date 
from 
      tyres_summarytable      as    sut,       
      tyres_vehicle           as    veh, 
      tyres_environment       as    env, 
      tyres_protectortype     as    prt, 
      tyres_standardsize      as    sts, 
      tyres_frontdrive        as    fdr, 
      tyres_trademark         as    trm 
where    sut.VehicID  =       veh.VehicID 
and      sut.EnvirID  =       env.EnvirID 
and      sut.ProtTypeID  =    prt.ProtTypeID 
and      sut.StandSizeID  =   sts.StandSizeID 
and      sut.FrontDriveID  =  fdr.FrontDriveID 
and      sut.TrMarkID  =      trm.TrMarkID 

$str";
?>

В результате как только странице будет передан нужный параметр - будет происходить автоматическая сортировка результата.

   
 
 автор: ElWhite   (29.08.2005 в 09:53)   письмо автору
 
   для: cheops   (26.08.2005 в 22:38)
 

Cheops, большое спасибо! Правда еще не проверял, но судя по всему все должно работать как изложенно.

   
 
 автор: ElWhite   (29.08.2005 в 12:29)   письмо автору
 
   для: cheops   (26.08.2005 в 22:38)
 

Сори, не работает. На сколько понимаю, дополнительная информация в ссылке не отрабатывается. Просто говоря, когда кликаю по ссылке $PHP_SELF?order=VehicType - страница перегружается, но сортировки не происходит.
Условия определения переменной $str работает правильно, т.е. если прописать

<?
$str 
""
  if(!isset(
$_GET['VehicType'])) $str "ORDER BY veh.VehicType"
?>
(знак ! перед isset) вместо

<?
$str 
""
  if(isset(
$_GET['VehicType'])) $str "ORDER BY veh.VehicType"
?>
, то сортировка устанавливается по колонке VehicType сразу по умолчанию.
Может ошибка в определении ссылки $PHP_SELF?order=VehicType ?

   
 
 автор: cheops   (29.08.2005 в 19:58)   письмо автору
 
   для: ElWhite   (29.08.2005 в 12:29)
 

Посмотрите содержимое массива $_GET - параметр туда попадает?
<?php
  
echo "<pre>";
  
print_r($_GET);
  echo 
"</pre>";
?>

   
 
 автор: ElWhite   (30.08.2005 в 09:26)   письмо автору
 
   для: cheops   (29.08.2005 в 19:58)
 

Да, попадает без вопросов, например результат:
Array
(
    [order] => VehicType
)
Но значение той же колонки VehicType не сортируются. То же самое касается и остальных колонок таблицы.

   
 
 автор: cheops   (30.08.2005 в 13:08)   письмо автору
 
   для: ElWhite   (30.08.2005 в 09:26)
 

Если вывести в окно браузера SQL-запрос $query - конструкция ORDER BY в ней присутствует?
<?php
echo $query;
?>

Если это так, то попробуйте взять запрос и выполнить его в каком-нибудь MySQL клиенте, например, phpMyAdmin - происходит сортировка или нет?

   
 
 автор: ElWhite   (30.08.2005 в 14:54)   письмо автору
 
   для: cheops   (30.08.2005 в 13:08)
 

$query выдает текст всего запроса к MySQL, кроме order by. То есть переменная $str не возвращает значение.

Я уж думаю, может ошибка в синтаксисе при вставке в запрос самой переменной. Хотя PHP не ругается, но сам запрос ведь пишется в соответствии с синтаксисом MySQL. Не-не, не думайте, переменная вставлена точто так, как Вы сказали до последней точки с запятой :)

А сам запрос с заданной руками сортировкой перед вставкой его в код я проверял прямо в MySQL. Все работало номально.

   
 
 автор: cheops   (30.08.2005 в 16:35)   письмо автору
 
   для: ElWhite   (30.08.2005 в 14:54)
 

Я обычно делают так пишу
<?php
  
echo "str - ".$str;
?>

непосредственно перед SQL-запросом. На что вам скорее всего будет выдано пустое значение. Далее двигайте вверх эту строку по скрипту пока не появится нужное значение $str - в этом районе где-то оно должно перезатираться. Т.е. нужно локализовать место, где значение $str подменяется. Может у вас SQL-запрос в фукнции выполняется, а значение $str не передаётся внутрь?

   
 
 автор: ElWhite   (31.08.2005 в 10:11)   письмо автору
 
   для: cheops   (30.08.2005 в 16:35)
 

Ерунда какая-то. Сделал как Вы посоветовали и выяснилось, что значения в переменную $str из условия при попытке сортировки вообще не передаются. При
<? $str ""
  if(isset(
$_GET['VehicType'])) $str "order by veh.VehicType";
    echo 
"str - ".$str?>
- str - пусто
только если задать значение принудительно, не через условие
<? $str "order by veh.VehicType"
  if(isset(
$_GET['VehicType'])) $str "order by veh.VehicType";
    echo 
"str - ".$str?>
- str - order by veh.VehicType
В любом случае большое спасибо за активную помощь. Не помню, чтобы встречал на форумах такого простого и исчерпывающего отзыва на свой вопрос. Спасибо. Буду искать ошибку дальше...

   
Rambler's Top100
вверх

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