Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Оптимизировать запрос / 11 сообщений из 11, страница 1 из 1
27.10.2013, 20:06:15
    #38442692
Include.nv
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизировать запрос
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
SELECT *
FROM students
WHERE student_id NOT IN
  ( SELECT DISTINCT s.student_id
    FROM students s
      JOIN coursestudent cs ON s.student_id = cs.student_id
      JOIN marks m ON cs.id = m.coursestudent_id
    WHERE m.mark < 60)



Знаний не хватает, чтобы упростить запрос. Наверное это очень просто, но в голову не идет. Помогите.
...
Рейтинг: 0 / 0
27.10.2013, 20:10:11
    #38442693
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизировать запрос
Покажите DDL таблиц, особенно students.
...
Рейтинг: 0 / 0
27.10.2013, 20:15:25
    #38442694
Include.nv
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизировать запрос
miksoft,
И еще вопрос, как правильно потом удалить записи с полученными id?
Вроде должно быть так, но не выходит.
Код: sql
1.
DELETE FROM students WHERE student_id ANY (SELECT student_id FROM students WHERE student_id NOT IN (SELECT DISTINCT s.student_id FROM students s JOIN coursestudent cs ON s.student_id = cs.student_id JOIN marks m ON cs.id = m.coursestudent_id WHERE m.mark < 60));



Код: 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.
CREATE TABLE `students` (
  `student_id` int(11) NOT NULL auto_increment,
  `student_name` varchar(50) NOT NULL,
  `group_id` int(11) NOT NULL,
  PRIMARY KEY  (`student_id`),
  KEY `student_group_fk` (`group_id`),
  CONSTRAINT `student_group_fk` FOREIGN KEY (`group_id`) REFERENCES `groups` (`group_id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

CREATE TABLE `coursestudent` (
  `id` int(11) NOT NULL auto_increment,
  `student_id` int(11) NOT NULL,
  `course_id` int(11) NOT NULL,
  PRIMARY KEY  (`id`),
  KEY `coursestudentlecturer_student_fk` (`student_id`),
  KEY ` coursestudentlecturer_course_fk` (`course_id`),
  CONSTRAINT ` coursestudentlecturer_course_fk` FOREIGN KEY (`course_id`) REFERENCES `courses` (`course_id`) ON DELETE CASCADE ON UPDATE CASCADE,
  CONSTRAINT `coursestudentlecturer_student_fk` FOREIGN KEY (`student_id`) REFERENCES `students` (`student_id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

CREATE TABLE `marks` (
  `coursestudent_id` int(11) NOT NULL,
  `mark` decimal(5,2) NOT NULL,
  `lecturer_id` int(11) NOT NULL,
  KEY `marks_coursestudent_fk` (`coursestudent_id`),
  KEY ` marks_lecturer_fk` (`lecturer_id`),
  CONSTRAINT ` marks_lecturer_fk` FOREIGN KEY (`lecturer_id`) REFERENCES `lecturers` (`lecturer_id`) ON DELETE CASCADE ON UPDATE CASCADE,
  CONSTRAINT `marks_coursestudent_fk` FOREIGN KEY (`coursestudent_id`) REFERENCES `coursestudent` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
...
Рейтинг: 0 / 0
27.10.2013, 21:00:20
    #38442714
Include.nv
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизировать запрос
miksoft,

Код: sql
1.
DELETE FROM students WHERE student_id IN (SELECT * FROM (SELECT student_id FROM students WHERE student_id NOT IN (SELECT DISTINCT s.student_id FROM students s JOIN coursestudent cs ON s.student_id = cs.student_id JOIN marks m ON cs.id = m.coursestudent_id WHERE m.mark < 60)) AS t);



Такой код получился в итоге, но как-то он мне не нравится.
...
Рейтинг: 0 / 0
28.10.2013, 00:07:37
    #38442852
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизировать запрос
Include.nv,

Убери distinct в подзапросе...
...
Рейтинг: 0 / 0
28.10.2013, 00:12:29
    #38442863
Include.nv
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизировать запрос
MasterZiv,

Зачем? Иначе будет несколько одинаковых student_id.
...
Рейтинг: 0 / 0
28.10.2013, 06:06:50
    #38442959
javajdbc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизировать запрос
>> Знаний не хватает, чтобы упростить запрос.
>> Наверное это очень просто, но в голову не идет. Помогите.

1. В чем проблема конкретно? запрос выдает
неправильные данные? или медлено?
если медлено так как медлено? а как хотелось бы?

2. не стесняйтесь ставить перевод строки на длинном СКЛ

3. скажите одним предложением
какаиох студентов вы хотите удалить из базы.

4. Если вы удалите студента, что вы думаете произойдет
с записью в таблице студент_куср которая имеет
внешний ключ на запись студента?

5. добавьте цолонку-флаг "is_deleted" в таблицу студентов и
вместо удаления выставляйте этот флаг.
...
Рейтинг: 0 / 0
28.10.2013, 07:38:06
    #38442970
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизировать запрос
Include.nvMasterZiv,

Зачем? Иначе будет несколько одинаковых student_id.

Ну и пусть будет. В чем проблема?
...
Рейтинг: 0 / 0
28.10.2013, 08:57:54
    #38442989
Алексей Куренков
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизировать запрос
Include.nv,

Код: 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.
SELECT *
FROM students
WHERE student_id NOT IN
  ( SELECT DISTINCT s.student_id
    FROM students s
      JOIN coursestudent cs ON s.student_id = cs.student_id
      JOIN marks m ON cs.id = m.coursestudent_id
    WHERE m.mark < 60)
-- упростим для наглядности
select *
from students
where student_id not in
(
	select student_id
	from students
	where student_id in
	(
		select student_id
		from coursestudent
		where cousestudent_id in
		(
			select id
			from marks
			where mark < 60
		)
	)
)
-- один из подзапросов можно смело выкинуть
select *
from students
where student_id not in
(
	select student_id
	from coursestudent
	where cousestudent_id in
	(
		select id
		from marks
		where mark < 60
	)
)



Далее по интересны индексы:
1. create index ix1 on marks (mark,id)
2. create index ix2 on cousestudent (coursestudent_id, student_id)
3. create index ix3 on student (student_id)

Если есть уже подобные индексы на указанные поля, естественно строить новые не нужно.
...
Рейтинг: 0 / 0
28.10.2013, 11:40:45
    #38443168
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизировать запрос
Алексей Куренков,

Условие, mark < 60 запросто может оказаться неселективным.
Так что возможно индекс не понадобится
...
Рейтинг: 0 / 0
28.10.2013, 15:39:51
    #38443695
javajdbc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизировать запрос
...возможно , быстрее будет
перевернуть знак поиска и делать
через NOT EXISTS...
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Оптимизировать запрос / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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