Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Запрос ничего не удаляет, а должен / 14 сообщений из 14, страница 1 из 1
25.03.2015, 15:09:46
    #38916603
Serzh007
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос ничего не удаляет, а должен
Подскажите, что с ним не так: должен удалить 661 стороку, но ничего не удаляет.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
DELETE `k-tn` FROM `k-tn` 
WHERE
    `idn` NOT IN (SELECT 
        `str`.`id_n`
    FROM
        (SELECT 
            `k-t_s`.`id_n`,
                GROUP_CONCAT(`k-t_s`.`id_s`
                    ORDER BY `k-t_s`.`id_s`
                    SEPARATOR '') `sostav`
        FROM
            `k-t_s`
        GROUP BY `k-t_s`.`id_n`) `str`
    GROUP BY `str`.`sostav`)



Пробовал переписывать через джоины — тоже нихрена не удаляет:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
DELETE `k-tn` FROM `k-tn`
        JOIN
    (SELECT 
        `str`.`id_n`
    FROM
        (SELECT 
        `k-t_s`.`id_n`,
            GROUP_CONCAT(`k-t_s`.`id_s`
                ORDER BY `k-t_s`.`id_s`
                SEPARATOR '') `sostav`
    FROM
        `k-t_s`
    GROUP BY `k-t_s`.`id_n`) `str`
    GROUP BY `str`.`sostav`) `nom` ON `k-tn`.`idn` = `nom`.`id_n` 
WHERE
    `nom`.`id_n` IS NULL



В обоих случаях: 0 row(s) affected.
...
Рейтинг: 0 / 0
25.03.2015, 15:17:27
    #38916618
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос ничего не удаляет, а должен
andrejk
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
SELECT 
        `str`.`id_n`
    FROM
        (SELECT 
            `k-t_s`.`id_n`,
                GROUP_CONCAT(`k-t_s`.`id_s`
                    ORDER BY `k-t_s`.`id_s`
                    SEPARATOR '') `sostav`
        FROM
            `k-t_s`
        GROUP BY `k-t_s`.`id_n`) `str`
    GROUP BY `str`.`sostav`

Что выдает этот фрагмент?
...
Рейтинг: 0 / 0
25.03.2015, 16:07:44
    #38916718
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос ничего не удаляет, а должен
andrejk
Код: sql
1.
2.
3.
4.
SELECT 
        `str`.`id_n`
-- skipped 
    GROUP BY `str`.`sostav`


Уже бредовато...
...
Рейтинг: 0 / 0
25.03.2015, 21:11:43
    #38917014
Serzh007
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос ничего не удаляет, а должен
miksoftandrejk
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
SELECT 
        `str`.`id_n`
    FROM
        (SELECT 
            `k-t_s`.`id_n`,
                GROUP_CONCAT(`k-t_s`.`id_s`
                    ORDER BY `k-t_s`.`id_s`
                    SEPARATOR '') `sostav`
        FROM
            `k-t_s`
        GROUP BY `k-t_s`.`id_n`) `str`
    GROUP BY `str`.`sostav`

Что выдает этот фрагмент?

Выдаёт номера уникальных наборов.

Вот часть таблиц базы, учавствующих в запросе:

Код: 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.
42.
43.
44.
45.
--
-- Структура таблицы `k-tn`
--

CREATE TABLE IF NOT EXISTS `k-tn` (
  `idn` int(10) unsigned zerofill NOT NULL AUTO_INCREMENT,
  `vr` int(11) NOT NULL,
  `ses` varchar(32) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
  PRIMARY KEY (`idn`),
  KEY `vr` (`vr`),
  KEY `ses` (`ses`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COMMENT='Наборы на кириллице' AUTO_INCREMENT=566440 ;

-- --------------------------------------------------------

--
-- Структура таблицы `k-ts`
--

CREATE TABLE IF NOT EXISTS `k-ts` (
  `ids` int(10) unsigned zerofill NOT NULL AUTO_INCREMENT,
  `s` varchar(60) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
  `kol` mediumint(8) unsigned NOT NULL COMMENT 'Количество',
  `f` tinyint(3) unsigned NOT NULL COMMENT 'Состояние',
  PRIMARY KEY (`ids`),
  UNIQUE KEY `s` (`s`),
  KEY `f` (`f`),
  KEY `kol` (`kol`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COMMENT='Слова на кириллице' AUTO_INCREMENT=9138213 ;

-- --------------------------------------------------------

--
-- Структура таблицы `k-t_s`
--

CREATE TABLE IF NOT EXISTS `k-t_s` (
  `id_sv` int(10) unsigned zerofill NOT NULL AUTO_INCREMENT,
  `id_n` int(10) unsigned zerofill NOT NULL,
  `id_s` int(10) unsigned zerofill NOT NULL,
  PRIMARY KEY (`id_sv`),
  UNIQUE KEY `sost` (`id_n`,`id_s`),
  KEY `id_s` (`id_s`),
  KEY `id_n` (`id_n`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COMMENT='Связи для кириллицы' AUTO_INCREMENT=8936102 ;
...
Рейтинг: 0 / 0
25.03.2015, 21:14:32
    #38917015
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос ничего не удаляет, а должен
andrejkВыдаёт номера уникальных наборов.И эти номера точно есть в таблице k-tn ?
...
Рейтинг: 0 / 0
25.03.2015, 21:20:31
    #38917018
Serzh007
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос ничего не удаляет, а должен
miksoftandrejkВыдаёт номера уникальных наборов.И эти номера точно есть в таблице k-tn ?
.
По идее да, т. к. в таблицу связей `k-t_s` они беруться из таблицы наборов `k-tn`.
...
Рейтинг: 0 / 0
25.03.2015, 21:25:44
    #38917019
Serzh007
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос ничего не удаляет, а должен
andrejk,

А вот этот запрос возвращает число уникальных наборов и всё тут в порядке:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
SELECT 
    COUNT(*)
FROM
    (SELECT 
        `str`.`id_n`
    FROM
        (SELECT 
        `k-t_s`.`id_n`,
            GROUP_CONCAT(`k-t_s`.`id_s`
                ORDER BY `k-t_s`.`id_s`
                SEPARATOR '') `sostav`
    FROM
        `k-t_s`
    GROUP BY `k-t_s`.`id_n`) `str`
    GROUP BY `str`.`sostav`) `t`
...
Рейтинг: 0 / 0
25.03.2015, 22:06:13
    #38917047
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос ничего не удаляет, а должен
andrejkmiksoftпропущено...
И эти номера точно есть в таблице k-tn ?
.
По идее да, т. к. в таблицу связей `k-t_s` они беруться из таблицы наборов `k-tn`."По идее" уже не работает. Так что надо проверять по факту. Возьмите одно или несколько значений из результата подзапроса и проверьте.
...
Рейтинг: 0 / 0
25.03.2015, 23:37:28
    #38917096
Serzh007
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос ничего не удаляет, а должен
miksoft,

Номера эти есть, постоянно проверяю на несоответствие такими запросами, выдаёт нулевой результат:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
	delete `k-t_s`
	from `k-t_s` LEFT JOIN `k-ts` ON `k-t_s`.`id_s`=`k-ts`.`ids`
	WHERE `k-ts`.`ids` IS NULL
========================
	delete `k-t_s`
	FROM `k-t_s` LEFT JOIN `k-tn` ON `k-t_s`.`id_n` = `k-tn`.`idn` 
	WHERE `k-tn`.`idn` IS NULL
========================
	delete `k-tn`
	FROM `k-tn` LEFT JOIN `k-t_s` ON `k-tn`.`idn`=`k-t_s`.`id_n`
	WHERE `k-t_s`.`id_n` IS NULL



Тем более сама система исправно выполняется, ею пользуются. Просто накапливаются постепенно одинаковые наборы от которых периодически хочу избавляться и вот написал запрос, а он ничего не удаляет.
...
Рейтинг: 0 / 0
25.03.2015, 23:48:51
    #38917100
Serzh007
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос ничего не удаляет, а должен
Добавил LEFT и всё сделалось.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
DELETE `k-tn` FROM `k-tn`
        LEFT JOIN
    (SELECT 
        `str`.`id_n`
    FROM
        (SELECT 
        `k-t_s`.`id_n`,
            GROUP_CONCAT(`k-t_s`.`id_s`
                ORDER BY `k-t_s`.`id_s`
                SEPARATOR '') `sostav`
    FROM
        `k-t_s`
    GROUP BY `k-t_s`.`id_n`) `str`
    GROUP BY `str`.`sostav`) `nom` ON `k-tn`.`idn` = `nom`.`id_n` 
WHERE
    `nom`.`id_n` IS NULL



Тогда получается, что в запросе:

DELETE `k-tn` FROM `k-tn`
WHERE
`idn` NOT IN (SELECT
`str`.`id_n`
FROM
(SELECT
`k-t_s`.`id_n`,
GROUP_CONCAT(`k-t_s`.`id_s`
ORDER BY `k-t_s`.`id_s`
SEPARATOR '') `sostav`
FROM
`k-t_s`
GROUP BY `k-t_s`.`id_n`) `str`
GROUP BY `str`.`sostav`)

проблема с фрагментом NOT IN? Хрень какая-то… Я и раньше замечал, что с NOT IN проблемы постоянные, но почему?
...
Рейтинг: 0 / 0
26.03.2015, 00:14:36
    #38917110
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос ничего не удаляет, а должен
andrejkНомера эти есть, постоянно проверяюТаки возьмите конкретное число из `k-tn`.`idn`, которое должно быть удалено, и проверьте его. Если обнаружите таковое - показывайте здесь.

Кстати, результат подзапроса может быть не таким, как вы ожидаете и, более того, иногда самопроизвольно меняться. Akina на это уже намекал ( 17431023 ).
...
Рейтинг: 0 / 0
26.03.2015, 00:16:44
    #38917114
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос ничего не удаляет, а должен
P.S. я долго писал свой пост и поста про "Добавил LEFT и всё сделалось." еще не видел на тот момент.
...
Рейтинг: 0 / 0
26.03.2015, 00:18:47
    #38917115
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос ничего не удаляет, а должен
andrejkЯ и раньше замечал, что с NOT IN проблемы постоянные, но почему?Без конкретных примеров есть только одна вероятная причина - недопонимание работы NOT IN.
Есть, конечно, вероятность багов и т.п., но это нужно доказывать.
...
Рейтинг: 0 / 0
26.03.2015, 02:07:28
    #38917163
Serzh007
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос ничего не удаляет, а должен
miksoft,

я не спец по БД, поэтому в разные тонкости вникать сложно, тем более что такие задачи решаю раз в нескмесяцев, всё забывается. Всё равно спасибо за помощь)
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Запрос ничего не удаляет, а должен / 14 сообщений из 14, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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