Задавайте вопросы, мы ответим
Вы не зашли.
Добрый день есть 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)
Неактивен
Ну первый запрос я бы написал как-то так:
Неактивен
Выдает ошибку в 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
Неактивен
А есть в таблице "books" какой-нибудь уникальный "id"?
вот его и подставь вместо *
Неактивен
А если так то это правильно просто лишь в этом варианте работает.
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)
Неактивен
Разумеется, нужно, чтобы подзапрос возвращал один столбец. Просто
не выбирайте COUNT(), а унесите его в HAVING целиком:
HAVING COUNT(b.id_book) = 1.
Неактивен
[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
Что же снова не так...
Неактивен
Ладно, прочитал тред с начала
Если Вам нужно удалить только авторов, то задача простая: нужно
найти книги, которые имеют только одного автора (не смотря в
таблицу авторов):
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;
Неактивен
paulus написал:
Ладно, прочитал тред с начала
Если Вам нужно удалить только авторов, то задача простая: нужно
найти книги, которые имеют только одного автора (не смотря в
таблицу авторов):
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;
Пора мне на пенсию
Неактивен
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;
Всем Большое Спасибо за помощь. А совместить это в один запрос уже не получиться?
Неактивен
Нет, с группировкой одним запросом — никак.
Неактивен