powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Оптимизировать запрос
11 сообщений из 11, страница 1 из 1
Оптимизировать запрос
    #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
Оптимизировать запрос
    #38442693
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Покажите DDL таблиц, особенно students.
...
Рейтинг: 0 / 0
Оптимизировать запрос
    #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
Оптимизировать запрос
    #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
Оптимизировать запрос
    #38442852
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Include.nv,

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

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

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

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

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

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

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

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

Ну и пусть будет. В чем проблема?
...
Рейтинг: 0 / 0
Оптимизировать запрос
    #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
Оптимизировать запрос
    #38443168
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей Куренков,

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


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