SQLinfo.ru - Все о MySQL Webew.ru: теория и практика веб-технологий

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 16.09.2010 18:46:13

Mobelis
Участник
Зарегистрирован: 15.08.2010
Сообщений: 10

delete с подзапросом

Добрый день есть MySql база данных я прикрепил файл с ней. Требуется: Удалить всех авторов которые написали по 1 книге.
Что бы получить id авторов мне удалось слепить такой вот запрос:

Код:

Select id_autor,(Select count(*) from books where books.id_autor=autors.id_autor) as res from autors where 1 in (Select count(*) from books where books.id_autor=autors.id_autor)

Просьба помочь реализовать удаление с обеих таблиц одним запросом и показать как правильно реализовать выше привидений запрос а то уж как то слишком громоздко выглядит.

Попробовал

Код:

delete from books,autors  where autors.id_autor in ( Select id_autor from autors where 1 in (Select count(*) from books where books.id_autor=autors.id_autor))

не прошло...

Отредактированно Mobelis (16.09.2010 19:07:27)


Прикрепленные файлы:
Attachment Icon publishment1.sql, Размер: 5,018 байт, Скачано: 9,716

Неактивен

 

#2 17.09.2010 12:50:28

vaspet
Завсегдатай
Зарегистрирован: 11.03.2009
Сообщений: 83

Re: delete с подзапросом

Ну первый запрос я бы написал как-то так:

SELECT
 id_autor, COUNT(b.*) AS res
FROM
 autors AS a
INNER JOIN
 books AS b
ON
 a.id_autor = b.id_autor
GROUP BY
 res
HAVING res = 1;
 

ну а второй соответственно:

DELETE FROM autors WHERE id_autor IN (SELECT id_autor FROM ... [то что выше написано] )
 

Неактивен

 

#3 18.09.2010 01:38:38

Mobelis
Участник
Зарегистрирован: 15.08.2010
Сообщений: 10

Re: delete с подзапросом

Выдает ошибку в Navicat 8

Код:

[SQL] SELECT id_autor, COUNT(b.*) AS res
FROM autors AS a
INNER JOIN
 books AS b
ON
 a.id_autor = b.id_autor
GROUP BY
 res
HAVING res = 1;
[Err] 1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '*) AS res
FROM autors AS a
INNER JOIN
 books AS b
ON
 a.id_autor = b.id_aut' at line 1

Неактивен

 

#4 18.09.2010 11:26:29

vaspet
Завсегдатай
Зарегистрирован: 11.03.2009
Сообщений: 83

Re: delete с подзапросом

А есть в таблице "books" какой-нибудь уникальный "id"?
вот его и подставь вместо *

Неактивен

 

#5 18.09.2010 13:49:06

Mobelis
Участник
Зарегистрирован: 15.08.2010
Сообщений: 10

Re: delete с подзапросом

А если так то это правильно просто лишь в этом варианте работает.

Код:

SELECT
 a.id_autor, COUNT(b.id_book) AS res
FROM
 autors AS a
INNER JOIN
 books AS b
ON
 a.id_autor = b.id_autor
GROUP BY
 id_autor
HAVING res = 1;

DELETE не проходит при таком запросе

Код:

[SQL] DELETE FROM autors
WHERE id_autor IN (
SELECT
 a.id_autor, COUNT(b.id_book) AS res
FROM
 autors AS a
INNER JOIN
 books AS b
ON
 a.id_autor = b.id_autor
GROUP BY
 id_autor
HAVING res = 1);
[Err] 1241 - Operand should contain 1 column(s)

Неактивен

 

#6 18.09.2010 14:41:40

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: delete с подзапросом

Разумеется, нужно, чтобы подзапрос возвращал один столбец. Просто
не выбирайте COUNT(), а унесите его в HAVING целиком:
HAVING COUNT(b.id_book) = 1.

Неактивен

 

#7 18.09.2010 16:03:24

Mobelis
Участник
Зарегистрирован: 15.08.2010
Сообщений: 10

Re: delete с подзапросом

Код:

[SQL] DELETE  FROM autors
WHERE id_autor IN  (
SELECT
 b.id_autor
FROM
 autors AS a
INNER JOIN
 books AS b
ON
 a.id_autor = b.id_autor
GROUP BY
 b.id_autor
HAVING COUNT(b.id_book) = 1);
[Err] 1093 - You can't specify target table 'autors' for update in FROM clause

Что же снова не так...

Неактивен

 

#8 18.09.2010 16:26:34

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: delete с подзапросом

Ладно, прочитал тред с начала smile

Если Вам нужно удалить только авторов, то задача простая: нужно
найти книги, которые имеют только одного автора (не смотря в
таблицу авторов):
SELECT id_author FROM books GROUP BY id_author HAVING COUNT(*) = 1;
После этого удаление из другой таблицы можно сделать через IN
DELETE FROM authors WHERE id_author IN ( … тут запрос … );

Если книги тоже надо удалить, то после удаления авторов проще всего
сделать через JOIN:
DELETE books FROM books LEFT JOIN authors USING (id_author) WHERE author.id_author IS NULL;

Неактивен

 

#9 18.09.2010 23:41:14

vaspet
Завсегдатай
Зарегистрирован: 11.03.2009
Сообщений: 83

Re: delete с подзапросом

paulus написал:

Ладно, прочитал тред с начала smile

Если Вам нужно удалить только авторов, то задача простая: нужно
найти книги, которые имеют только одного автора (не смотря в
таблицу авторов):
SELECT id_author FROM books GROUP BY id_author HAVING COUNT(*) = 1;
После этого удаление из другой таблицы можно сделать через IN
DELETE FROM authors WHERE id_author IN ( … тут запрос … );

Если книги тоже надо удалить, то после удаления авторов проще всего
сделать через JOIN:
DELETE books FROM books LEFT JOIN authors USING (id_author) WHERE author.id_author IS NULL;

Пора мне на пенсию

Неактивен

 

#10 19.09.2010 12:23:31

Mobelis
Участник
Зарегистрирован: 15.08.2010
Сообщений: 10

Re: delete с подзапросом

Код:

DELETE  FROM autors
WHERE id_autor IN  (
SELECT id_autor FROM books GROUP BY id_autor HAVING COUNT(*) = 3);
DELETE books FROM books LEFT JOIN autors USING (id_autor) WHERE autors.id_autor IS NULL;  

Всем Большое Спасибо за помощь. А совместить это в один запрос уже не получиться?

Неактивен

 

#11 19.09.2010 15:34:28

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: delete с подзапросом

Нет, с группировкой одним запросом — никак.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson