[PHP + MYSQL] Выборка информации из БД

Kurica
Дата: 22.08.2006 18:37:41
Помогите пожалуста решить задачу:
в sql ест 2 колонки port и text.
текcт в колонке port может повторяться.
так вот надо: что бы на экран выводился port и соответствуюсций text. если port повторяется, то текст port`a выводится один раз, а за ним все соответствующие тексты.
на пример: в sql:

port text
порт1 текст1
порт2 текст2
порт1 текст3

должно выводится:

порт1
текст1
текст3

порт2
текст2

Как будет выглядет php код?
заранее спасибо :)
pamir
Дата: 22.08.2006 18:47:41
выборку сортируешь по полю port (или по port, text если нужно и текст отсортировать)
Далее в цикле по строкам выборки - если port равен порту из предыдущей строки - вывести text, иначе вывести порт, а затем текст).

По-моему, это элементарно.
Kurica
Дата: 22.08.2006 18:56:16
по-моему тоже, но мне нужен именно сам код цикла "по строкам выборки - если port равен порту из предыдущей строки"...
cама я ещё не могу его написать...
slmark
Дата: 22.08.2006 18:56:21
Я, конечно, не гуру в PHP. Но такую проблему решал таким образом:
перебираем все значения столбца port, и загоняем их в массив, предварительно проверив, чтоб такого значения в массиве не было при помощи in_array.
У вас будет массив с уникальными значениями столбца port. Дальше, думается, понятно что надо сделать.
Спасибо.
Anjey aka PM
Дата: 22.08.2006 20:13:45
slmark
Я, конечно, не гуру в PHP. Но такую проблему решал таким образом:
перебираем все значения столбца port, и загоняем их в массив, предварительно проверив, чтоб такого значения в массиве не было при помощи in_array.
У вас будет массив с уникальными значениями столбца port. Дальше, думается, понятно что надо сделать.
Спасибо.


медленный способ да и в вопросе памяти прожорлив.

Лучше так

$last_port = NULL;
while ($rec = mysql_fetch_Assoc($result)) {
  if ($rec['port'] == $last_port) {
    // Вывести только текст
  } else {
    $last_port = $rec['port'];
    // Вывести порт и текст
  }
}

ЗЫ: при условии что набор записей отсортирован по полю port
DocAl
Дата: 23.08.2006 04:23:24
Вообще говоря, логичней написать немного более сложный запрос, чем на клиенте на PHP колбасить массивы. MySQL какой версии?
Kurica
Дата: 23.08.2006 10:07:04
Anjey aka PM, спасибо за подсказку! попробую исползовать её :)

DocAl, сqл во какой MySQL 3.23.58
pamir
Дата: 23.08.2006 10:38:58
DocAl
Вообще говоря, логичней написать немного более сложный запрос, чем на клиенте на PHP колбасить массивы. MySQL какой версии?

А где тут колбашенье массивов - записи все равно перебирать нужно, ввели одну переменную - предыдущий порт - вот и все колбашенье.
DocAl
Дата: 23.08.2006 16:31:40
pamir
DocAl
Вообще говоря, логичней написать немного более сложный запрос, чем на клиенте на PHP колбасить массивы. MySQL какой версии?

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

Ну, про колбашение массивов я говорил про вариант, предложенный slmark. Для MySQL 3.23 ваш вариант оптимален, для 4.1+ же было бы разумно использовать GROUP_CONCAT.
Berkut
Дата: 23.08.2006 17:08:47
На MySQL такую выборку еще можно сделать с помощью переменных (подойдет для 3.23):

create table t1 (   port varchar(10) not null,   info varchar(255) not null);

insert into t1 values ('port1', 'Hello world'), ('port2', 'This is test'), ('port1', 'Hello world-2!');

select * from t1 order by port

port info
------ --------------
port1 Hello world
port1 Hello world-2!
port2 This is test

set @port:='';

select if(@port<>port, port, '') ports, info, @port:=port from t1 order by port;

ports info @port:=port
------ -------------- -----------
port1 Hello world port1
Hello world-2! port1
port2 This is test port2