powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / SQL-запрос, табличный вид выводимых данных
6 сообщений из 6, страница 1 из 1
SQL-запрос, табличный вид выводимых данных
    #38551284
G00dWINe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет всем!
Имеется БД, в которой есть, допустим, три связанные таблицы, например, Город, Район, Улица.
Ну вы поняли, да, какие тут связи? )
Итак, вопрос: возможно ли вывести все данные в виде:

- Город 1
- Район 1
- Улица 1
- Улица 2
-Район 2
- Улица 3
- Район 3
- Улица 4
- Улица 5
- Улица 6
- Город 2
- Район 4

Ну и т.д.
...
Рейтинг: 0 / 0
SQL-запрос, табличный вид выводимых данных
    #38551321
Stupid_BOT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
G00dWINe,
можно
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
/* метаданные */
create table town (
  id int not null auto_increment primary key,
  name varchar(100)
);
create table district (
  id int not null auto_increment primary key,
  town_id int,
  name varchar(100),
  constraint fk_district_town foreign key (town_id) references town(id)
);
create table street (
  id int not null auto_increment primary key,
  district_id int,
  name varchar(100),
  constraint fk_street_district foreign key (district_id) references district(id)
);


/* данные */
insert into town(id,name) 
values (2,'Город 2'),(1,'Город 1');

insert into district(id,town_id,name) 
values(1,1,'Район 1'),(4,2,'Район 4'),(3,1,'Район 3'),(2,1,'Район 2');

insert into street(id,district_id,name) 
values(5,3,'Улица 5'),(2,1,'Улица 2'),(1,1,'Улица 1'),(4,3,'Улица 4'),(3,2,'Улица 3'),(6,3,'Улица 6');


/* запрос */
select 
  concat('-', nume) what_for
from (
select  -- города
  t.id   t_id, 
  0      d_id, 
  0      s_id, 
  concat(' ',t.name) nume
from 
  town t
  
union all
select -- районы
  t.id, d.id, 0, concat(case when d.id=2 then '' else ' ' end, d.name)
from
  town t
  join district d on d.town_id = t.id

union all
select -- улицы
  t.id, d.id, s.id, concat(' ', s.name)
from
  town t 
  join district d on d.town_id = t.id
  join street s on s.district_id = d.id
order by 1, 2, 3  
) d;

только зачем средствами СУБД ?
...
Рейтинг: 0 / 0
SQL-запрос, табличный вид выводимых данных
    #38551381
G00dWINe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Stupid_BOTG00dWINe,
можно
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
/* метаданные */
create table town (
  id int not null auto_increment primary key,
  name varchar(100)
);
create table district (
  id int not null auto_increment primary key,
  town_id int,
  name varchar(100),
  constraint fk_district_town foreign key (town_id) references town(id)
);
create table street (
  id int not null auto_increment primary key,
  district_id int,
  name varchar(100),
  constraint fk_street_district foreign key (district_id) references district(id)
);


/* данные */
insert into town(id,name) 
values (2,'Город 2'),(1,'Город 1');

insert into district(id,town_id,name) 
values(1,1,'Район 1'),(4,2,'Район 4'),(3,1,'Район 3'),(2,1,'Район 2');

insert into street(id,district_id,name) 
values(5,3,'Улица 5'),(2,1,'Улица 2'),(1,1,'Улица 1'),(4,3,'Улица 4'),(3,2,'Улица 3'),(6,3,'Улица 6');


/* запрос */
select 
  concat('-', nume) what_for
from (
select  -- города
  t.id   t_id, 
  0      d_id, 
  0      s_id, 
  concat(' ',t.name) nume
from 
  town t
  
union all
select -- районы
  t.id, d.id, 0, concat(case when d.id=2 then '' else ' ' end, d.name)
from
  town t
  join district d on d.town_id = t.id

union all
select -- улицы
  t.id, d.id, s.id, concat(' ', s.name)
from
  town t 
  join district d on d.town_id = t.id
  join street s on s.district_id = d.id
order by 1, 2, 3  
) d;

только зачем средствами СУБД ?

Спасибо.
Средствами СУБД, потому что никак не могу пока додуматься с циклом вывода: http://www.sql.ru/forum/1075722/vyvod-tablichki-v-word
...
Рейтинг: 0 / 0
SQL-запрос, табличный вид выводимых данных
    #38552422
Stupid_BOT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> G00dWINe,
> Средствами СУБД, потому что никак не могу пока додуматься с циклом вывода.
запрос:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
select
  t.id   t_id, 
  d.id   d_id, 
  s.id   s_id, 
  t.name t_name, 
  d.name d_name, 
  s.name s_name
from
  town t 
  left join district d on d.town_id = t.id -- left join - чтобы не утерять города без районов
  left join street s on s.district_id = d.id -- left join - чтобы не утерять районы без улиц
order by 1, 2, 3


цикл вывода (псевдокод)
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
var t_id = d_id = 0, row = 0;
while (dataSet.hasNext()) { // цикл по записям набора
  dataSet.next();
  if (t_id != dataSet.t_id.value) { // новый город !
    table(++row, 1).text = dataSet.t_name.value;
    t_id = dataSet.t_id.value;
  }
  if (null != dataSet.d_id.value && d_id != dataSet.d_id.value) { // новый район (а может и нет)
    table(++row, 2).text = dataSet.d_name.value;
    d_id = dataSet.d_id.value;
  }
  if (null != dataSet.s_id) { // улицу (если есть) выводим для каждой записи
    table(++row, 3).text = dataSet.s_name.value;
  }
}


...
Рейтинг: 0 / 0
SQL-запрос, табличный вид выводимых данных
    #38554418
deblogger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тут карта.

Допустим строка

city block street build

индексы полей соответственно
0 1 2 3

и таких обычных строк в результе дочерта

$arr=aray();
foreach($res as $row)
$arr[$row[0]][$row[1]][$row[2]]=$row[3];

Все само построится, абсолютно точно. В php применяется balanced tree для хранения "массивов", а это дерево в точности nested set model
...
Рейтинг: 0 / 0
SQL-запрос, табличный вид выводимых данных
    #38554421
deblogger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну то есть пхп за вас всю черную работу по определению что новое, что уже есть и сделает. Разумеется запрос должен быть полностью нормальным. То есть сколько есть там улиц - столько должно быть строк. С NULL применяйте coalesce() на что-то заведомо известное.
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / SQL-запрос, табличный вид выводимых данных
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]