перекресный запрос или как сказать

SBS Soft
Дата: 15.02.2013 16:25:02
Доброе время суток
есть несколько таблиц все связаны одному (главному) основному таблицу
Основная таблица
CREATE TABLE course (
  id bigint(10) unsigned NOT NULL AUTO_INCREMENT,
  fullname varchar(254) NOT NULL DEFAULT '',
  shortname varchar(100) NOT NULL DEFAULT '',
.....
PRIMARY KEY (`id`))


1-таблица
CREATE TABLE lessons(
  id bigint(10) unsigned NOT NULL AUTO_INCREMENT,
  course bigint(10) unsigned NOT NULL DEFAULT '0',
  name varchar(100) NOT NULL DEFAULT '',
.....
PRIMARY KEY (`id`))

2-таблица
CREATE TABLE quiz(
  id bigint(10) unsigned NOT NULL AUTO_INCREMENT,
  course bigint(10) unsigned NOT NULL DEFAULT '0',
  name varchar(100) NOT NULL DEFAULT '',
.....
PRIMARY KEY (`id`))

3-таблица
CREATE TABLE choise(
  id bigint(10) unsigned NOT NULL AUTO_INCREMENT,
  course bigint(10) unsigned NOT NULL DEFAULT '0',
  name varchar(100) NOT NULL DEFAULT '',
.....
PRIMARY KEY (`id`))

с помощью запроса
SELECT course.fullname as kurs, count(lesson.id) as cnt
FROM course
  INNER JOIN lesson ON (course.id = lesson.course)
GROUP BY
  course.fullname
ORDER BY cnt desc

узнаем - сколько лекции созданы по каждому курсу.


А мне нужен запрос, который ответ будет в форме
KursЛекции Задании Опросы
Курс 110 5 2
Курс 29 6 0
...... ... ...
Курс N4 0 1


Заранее спасибо
Akina
Дата: 15.02.2013 17:19:30
Ну так и прикручивай все три таблицы к основной. Только используй левое связывание.
googleiswatchingyou
Дата: 15.02.2013 18:05:31
SBS Soft
Дата: 15.02.2013 21:20:16
Akina,

Спасибо
SELECT course.fullname as kurs, 
  COUNT(DISTINCT lesson.id) AS lesson,
  COUNT(DISTINCT quiz.id) AS quiz
FROM course
  LEFT JOIN lesson ON (course.id = lesson.course)
  LEFT JOIN quiz ON (course.id = quiz.course)
GROUP BY
  course.fullname

типа так сделал, по моему работал правильно
теперь еще одно задача: если оба (lesson и quiz) равно на 0 как сбрасывать (не отображать)
Akina
Дата: 15.02.2013 21:41:06
HAVING lesson+quiz > 0
SBS Soft
Дата: 16.02.2013 10:41:14
Akina,

Спасибо!!!
Сортировка по lesson+quiz+ ... как делаем, не получается
qwerty112
Дата: 16.02.2013 11:56:45
SBS Soft
Сортировка по lesson+quiz+ ... как делаем, не получается

сортировка или фильтр ?
это может :
HAVING ifnull(COUNT(DISTINCT lesson.id),0)+ifnull(COUNT(DISTINCT quiz.id),0)> 0

?
SBS Soft
Дата: 17.02.2013 17:09:46
qwerty112,

Надо сортировать курсы по количеству лекции, задании, опросы, ...
...
ORDER BY  (lessons+quiz+...) desc
...

не работает
Akina
Дата: 17.02.2013 22:49:55
Нужно не по полям выходного набора сортировать, а по выражениям. имена полей появляются лишь после всех действий, в т.ч. пи после сортировки.
SBS Soft
Дата: 18.02.2013 13:18:34
Akina,
Спасибо!!!
Почему про
...
order by
COUNT(DISTINCT lesson.id)+
  COUNT(DISTINCT quiz.id) + ...
...

не думал?
Еще
SELECT course.fullname as kurs, 
  COUNT(DISTINCT lesson.id) AS lesson,
  COUNT(DISTINCT quiz.id) AS quiz,
  ...
FROM course
  LEFT JOIN lesson ON (course.id = lesson.course)
  LEFT JOIN quiz ON (course.id = quiz.course)
  ....
GROUP BY
  course.fullname
having (lesson+quiz+...)>0
order by
COUNT(DISTINCT lesson.id)+
  COUNT(DISTINCT quiz.id) + ... desc

запроса можно оптимизировать, а то этот запрос выполняется на LOCALHOST'е 30-45 секунд