Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MySQL > Вывод результатов запроса в табличной форме.


Автор: yerdnA 24.6.2004, 15:59

Структура таблиц
deplist
depid int not null primary key auto_increment
depname varchar(30) not null unique

talks
talkid int not null primary key auto_increment
filldate date not null
telno tinyint not null
minutes integer not null
depname int not null references deplist

query
select talks.filldate, deplist.depname,talks.telno,talks.minutes,
from deplist, talks
where deplist.depid=talks.depid and
filldate='2004.05.31';

Результат
31.05.2004-depar1-100-110
31.05.2004-depar1-101-90
31.05.2004-depar1-102-130
31.05.2004-depar2-201-130
31.05.2004-depar2-202-100
31.05.2004-depar2-203-100
31.05.2004-depar3-300-250
31.05.2004-depar3-301-45
31.05.2004-depar3-302-45

Какой надо построить запрос чтобы получить вот такой результат.

---depar1--|---depar2--|---depar3--|
-----+-----+-----+-----+-----+-----+
telno|-min-|telno|-min-|telno|-min-| date
-----+-----+-----+-----+-----+-----+
-100-|-110-|-200-|-130-|-300-|-250-|31.05.2004
-101-|-90--|-201-|-100-|-301-|-45--|31.05.2004
-102-|-130-|-203-|-100-|-303-|-45--|31.05.2004
-----+-----+-----+-----+-----+-----+
В качестве заголовка строк filldate, столбцов - depname, а на их пересечении данные telno и min.

Т.е. первые два столбца относятся к depar1
3,4 столбец к depar2; 5,6 к depar3.

P.S. '-' нарисовал чтобы таблица не съезжала.
Перлами типа: почитай документацию или ознакомься с основами MySQL, прошу вас утруждаться. Если бы там нашел тут бы не тратил драгоценное время (свое и чужое).

Автор: Akina 24.6.2004, 18:06
И все-таки
Цитата
ознакомься с основами MySQL
потому как их вполне достаточно. Поясняю.

Есть твой запрос:
Код
select talks.filldate, deplist.depname,talks.telno,talks.minutes,
from deplist, talks
where deplist.depid=talks.depid and
filldate='2004.05.31';

Назовем его, скажем, запрос А.
Создадим из него запрос А1:
Код
select talks.filldate, deplist.depname,talks.telno,talks.minutes,
from deplist, talks
where deplist.depid=talks.depid and
filldate='2004.05.31' and
deplist.depname='depar1';

Аналогично создадим запросы А2 и А3.
Теперь свяжем запросы и создадим запрос Б:
Код
select A1.*, A2.*, A3.*
from A1
inner join A2
on A1.filldate=A2.filldate and A1.depname=A2.depname
inner join A3
on A1.filldate=A3.filldate and A1.depname=A3.depname

Понимаешь, что получилось? данные слеплены, теперь осталось получить необходимые данные из запроса Б.

Доделку и удаление лишнего сделаешь сам - мне влом.

Автор: <Spawn> 24.6.2004, 20:01
Такого тебе не удасться достичь одним селектом. Ты куда все выводишь? На веб страницу? В любом случае сначала нужно получить все отделы:

Код
SELECT deplist.depname
  FROM deplist, talks
 WHERE deplist.depid=talks.depid
   AND filldate='2004.05.31' group by deplist.depname


а потом сделать цикл по ним и сделать селект такого вида:

Код
'SELECT talks.filldate, deplist.depname,talks.telno,talks.minutes,
   FROM deplist, talks
  WHERE deplist.depid=talks.depid
    AND filldate='2004.05.31'
    AND deplist.depname = ' + <Название ранее полученого отдела>


после чего вывести все так как тебе нужно

Автор: yerdnA 25.6.2004, 08:11
Спасибо за содействие. Теперь знаю что надо. Свой путь познания БД начинал с MS Access (он очень сильно ламероориентирован), в нем есть такая штука как перекрестный запрос (crosstab query), по незнанию думал что это стандартная инструкция SQL . Оказывается что в MySQL подобное надо ручками делать. Ну что ж, будем.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)