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

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

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

Вы не зашли.

#1 26.03.2014 16:01:33

Lamener
Участник
Зарегистрирован: 15.03.2014
Сообщений: 18

Запрос на выборку с уловием NOT

Доброго времени суток.

Есть таблица !
http://sqlinfo.ru/forum/attachment.php?item=481&download=1

Вот зарос.
SELECT `video_id` FROM categories_videos Where category_id NOT IN (4,5) ORDER BY `categories_videos`.`video_id` ASC GROUP BY video_id

Как его подправить что бы в результате были только video_id где вообще не встречалось условие. Т.е сейчас он отдает строку с результатом

video_id => 91 и video_id => 92 а мне нужно что бы этих строк небыло.

Отредактированно Lamener (26.03.2014 16:17:18)


Прикрепленные файлы:
Attachment Icon Untitled-1.jpg, Размер: 20,076 байт, Скачано: 647

Неактивен

 

#2 26.03.2014 16:37:31

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Запрос на выборку с уловием NOT

select * from
(SELECT `video_id` FROM categories_videos GROUP BY video_id) t1
left join
(SELECT `video_id` FROM categories_videos Where category_id IN (4,5) GROUP BY video_id) t2
using(video_id) where t2.video_id is null;
 

Неактивен

 

#3 26.03.2014 21:38:11

Lamener
Участник
Зарегистрирован: 15.03.2014
Сообщений: 18

Re: Запрос на выборку с уловием NOT

vasya написал:

select * from
(SELECT `video_id` FROM categories_videos GROUP BY video_id) t1
left join
(SELECT `video_id` FROM categories_videos Where category_id IN (4,5) GROUP BY video_id) t2
using(video_id) where t2.video_id is null;
 

Работает если ограничить до 2К ! Но очень сильно напрягает сервер. в этой таблице 137074 строк. А если без ограничения у меня виснет phpmyadmin.

Отображение строк 0 - 1999 (2000 всего, Запрос занял 2.0357 сек.)

Отредактированно Lamener (26.03.2014 21:42:53)

Неактивен

 

#4 26.03.2014 21:48:33

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Запрос на выборку с уловием NOT

Индексы на video_id и (category_id, video_id) есть?

Неактивен

 

#5 26.03.2014 21:53:07

Lamener
Участник
Зарегистрирован: 15.03.2014
Сообщений: 18

Re: Запрос на выборку с уловием NOT

vasya написал:

Индексы на video_id и (category_id, video_id) есть?

Только у video_id есть индекс

Добавил индекс category_id

Отображение строк 0 - 1999 (2000 всего, Запрос занял 1.9792 сек.)

Чуток легче стало !

Отредактированно Lamener (26.03.2014 21:56:13)

Неактивен

 

#6 26.03.2014 21:55:43

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Запрос на выборку с уловием NOT

Добавьте ещё составной

alter table categories_videos add index (category_id, video_id);

Неактивен

 

#7 26.03.2014 21:59:15

Lamener
Участник
Зарегистрирован: 15.03.2014
Сообщений: 18

Re: Запрос на выборку с уловием NOT

vasya написал:

Добавьте ещё составной

alter table categories_videos add index (category_id, video_id);

Добавил !
Отображение строк 0 - 1999 (2000 всего, Запрос занял 1.9657 сек.)

Неактивен

 

#8 26.03.2014 22:04:01

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Запрос на выборку с уловием NOT

Покажите

show create table categories_videos;

explain extended select t1.video_id from (SELECT `video_id` FROM categories_videos GROUP BY video_id) t1 left join (SELECT `video_id` FROM categories_videos Where category_id IN (4,5) GROUP BY video_id) t2 using(video_id) where t2.video_id is null\G

show warnings\G
 


Обратите внимание, в запросе вместо * нужно  t1.video_id

Неактивен

 

#9 26.03.2014 22:09:47

Lamener
Участник
Зарегистрирован: 15.03.2014
Сообщений: 18

Re: Запрос на выборку с уловием NOT

vasya написал:

Покажите

show create table categories_videos;

explain extended select t1.video_id from (SELECT `video_id` FROM categories_videos GROUP BY video_id) t1 left join (SELECT `video_id` FROM categories_videos Where category_id IN (4,5) GROUP BY video_id) t2 using(video_id) where t2.video_id is null\G

show warnings\G
 


Обратите внимание, в запросе вместо * нужно  t1.video_id

На это у меня ошибка
#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 '\G

Неактивен

 

#10 26.03.2014 22:11:29

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Запрос на выборку с уловием NOT

вместо \G используйте ;

Неактивен

 

#11 26.03.2014 22:12:43

Lamener
Участник
Зарегистрирован: 15.03.2014
Сообщений: 18

Re: Запрос на выборку с уловием NOT

vasya написал:

вместо \G используйте ;

Ага я уже понял !
Вот скрин
http://joxi.ru/axgzUxjKTJAnNimEbhQ

Неактивен

 

#12 26.03.2014 22:18:18

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Запрос на выборку с уловием NOT

Результат от  show warnings;  обрезан
и покажите ещё show create table categories_videos;

Неактивен

 

#13 26.03.2014 22:23:33

Lamener
Участник
Зарегистрирован: 15.03.2014
Сообщений: 18

Re: Запрос на выборку с уловием NOT

vasya написал:

Результат от  show warnings;  обрезан
и покажите ещё show create table categories_videos;

Он тоже получется обрезанный ! Но это так phpmyadmin отображает.
http://joxi.ru/8BozUxjKTJAtNgghaWQ

Неактивен

 

#14 26.03.2014 22:27:50

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Запрос на выборку с уловием NOT

Там есть какие-то кнопочки, чтобы развернуть ответ полностью, но лучше вообще не пользоваться им.
У вас есть возможность выполнить запрос через клиент mysql?
И вам действительно необходимо получить в ответ все 30 тыс результатов?

Неактивен

 

#15 26.03.2014 22:35:12

Lamener
Участник
Зарегистрирован: 15.03.2014
Сообщений: 18

Re: Запрос на выборку с уловием NOT

vasya написал:

Там есть какие-то кнопочки, чтобы развернуть ответ полностью, но лучше вообще не пользоваться им.
У вас есть возможность выполнить запрос через клиент mysql?
И вам действительно необходимо получить в ответ все 30 тыс результатов?

Да, есть доступ по ssh !

Нашел кнопочки

show create table categories_videos;
http://joxi.ru/Dh0zU_3JTJAJdOMc1SM

Неактивен

 

#16 26.03.2014 22:49:13

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Запрос на выборку с уловием NOT

составной индекс у вас уже был. Так что лишний лучше удалить

alter table categories_videos drop index category_id;


А какой полный ответ у show warnings?

Неактивен

 

#17 26.03.2014 22:56:15

Lamener
Участник
Зарегистрирован: 15.03.2014
Сообщений: 18

Re: Запрос на выборку с уловием NOT

vasya написал:

составной индекс у вас уже был. Так что лишний лучше удалить

alter table categories_videos drop index category_id;


А какой полный ответ у show warnings?

А вот у show warnings такой кнопочки нет ! (

Неактивен

 

#18 26.03.2014 23:06:34

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Запрос на выборку с уловием NOT

Попробуйте такой вариант:

select t1.video_id from
(SELECT `video_id` FROM categories_videos GROUP BY video_id) t1
left join
(SELECT `video_id` FROM categories_videos Where category_id IN (4,5)) t2
using(video_id) where t2.video_id is null;


При сравнении выполняйте запросы по ssh через клиент mysql.
Ну и главное, вам действительно нужны все 30 тыс результатов?

Неактивен

 

#19 26.03.2014 23:06:45

Lamener
Участник
Зарегистрирован: 15.03.2014
Сообщений: 18

Re: Запрос на выборку с уловием NOT

Lamener написал:

vasya написал:

составной индекс у вас уже был. Так что лишний лучше удалить

alter table categories_videos drop index category_id;


А какой полный ответ у show warnings?

А вот у show warnings такой кнопочки нет ! (

mysql> show warnings\G
*************************** 1. row ***************************
  Level: Note
   Code: 1003
Message: select `t1`.`video_id` AS `video_id` from (select `yourhub_kvs`.`ktvs_categories_videos`.`video_id` AS `video_id` from `yourhub_kvs`.`ktvs_categories_videos` group by `yourhub_kvs`.`ktvs_categories_videos`.`video_id`) `t1` left join (select `yourhub_kvs`.`ktvs_categories_videos`.`video_id` AS `video_id` from `yourhub_kvs`.`ktvs_categories_videos` where (`yourhub_kvs`.`ktvs_categories_videos`.`category_id` in (4,5)) group by `yourhub_kvs`.`ktvs_categories_videos`.`video_id`) `t2` on((`t2`.`video_id` = `t1`.`video_id`)) where isnull(`t2`.`video_id`)
1 row in set (0.00 sec)

Неактивен

 

#20 26.03.2014 23:11:01

Lamener
Участник
Зарегистрирован: 15.03.2014
Сообщений: 18

Re: Запрос на выборку с уловием NOT

Вот полный ответ!


mysql> show create table ktvs_categories_videos;

+------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------         -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------         ----------------------------------------------------------------------------------------------------+
| Table                  | Create Table                                                                                                                                                                                                                                                                                                                                                                                                                                             |
+------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------         -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------         ----------------------------------------------------------------------------------------------------+
| ktvs_categories_videos | CREATE TABLE `ktvs_categories_videos` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `category_id` int(10) unsigned NOT NULL,
  `video_id` int(10) unsigned NOT NULL,
  PRIMARY KEY (`category_id`,`video_id`),
  UNIQUE KEY `id` (`id`),
  KEY `video_id` (`video_id`),
  KEY `category_id` (`category_id`,`video_id`)
) ENGINE=MyISAM AUTO_INCREMENT=155829 DEFAULT CHARSET=utf8 CHECKSUM=1 DELAY_KEY_WRITE=1 ROW_FORMAT=FIXED |
+------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------         -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------         ----------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql>
mysql> explain extended select t1.video_id from (SELECT `video_id` FROM ktvs_categories_videos GROUP BY video_id) t1 left join (SELECT `video_id` FROM ktvs_categories_videos W         here category_id IN (4,5) GROUP BY video_id) t2 using(video_id) where t2.video_id is null\G
*************************** 1. row ***************************
           id: 1
  select_type: PRIMARY
        table: <derived2>
         type: ALL
possible_keys: NULL
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 31998
     filtered: 100.00
        Extra:
*************************** 2. row ***************************
           id: 1
  select_type: PRIMARY
        table: <derived3>
         type: ALL
possible_keys: NULL
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 3476
     filtered: 100.00
        Extra: Using where; Not exists
*************************** 3. row ***************************
           id: 3
  select_type: DERIVED
        table: ktvs_categories_videos
         type: range
possible_keys: PRIMARY,category_id
          key: category_id
      key_len: 4
          ref: NULL
         rows: 3666
     filtered: 100.00
        Extra: Using where; Using index; Using temporary; Using filesort
*************************** 4. row ***************************
           id: 2
  select_type: DERIVED
        table: ktvs_categories_videos
         type: range
possible_keys: NULL
          key: video_id
      key_len: 4
          ref: NULL
         rows: 34269
     filtered: 100.00
        Extra: Using index for group-by
4 rows in set, 1 warning (0.18 sec)

mysql>
mysql> show warnings\G
*************************** 1. row ***************************
  Level: Note
   Code: 1003
Message: select `t1`.`video_id` AS `video_id` from (select `yourhub_kvs`.`ktvs_categories_videos`.`video_id` AS `video_id` from `yourhub_kvs`.`ktvs_categories_videos` group by          `yourhub_kvs`.`ktvs_categories_videos`.`video_id`) `t1` left join (select `yourhub_kvs`.`ktvs_categories_videos`.`video_id` AS `video_id` from `yourhub_kvs`.`ktvs_categories_videos` where (`yourhub_kvs`.`ktvs_categories_videos`.`category_id` in (4,5)) group by `yourhub_kvs`.`ktvs_categories_videos`.`video_id`) `t2` on((`t2`.`video_id` = `t1`.`video_id`)) where isnull(`t2`.`video_id`)
1 row in set (0.00 sec)
 

Отредактированно Lamener (26.03.2014 23:12:32)

Неактивен

 

#21 26.03.2014 23:14:09

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Запрос на выборку с уловием NOT

А что по времени с этим вариантом http://sqlinfo.ru/forum/viewtopic.php?pid=39393#p39393 ?

Неактивен

 

#22 26.03.2014 23:15:03

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Запрос на выборку с уловием NOT

И ещё вы пропустили http://sqlinfo.ru/forum/viewtopic.php?pid=39391#p39391

Неактивен

 

#23 26.03.2014 23:17:45

Lamener
Участник
Зарегистрирован: 15.03.2014
Сообщений: 18

Re: Запрос на выборку с уловием NOT

vasya написал:

Ну и главное, вам действительно нужны все 30 тыс результатов?

Не всегда но может случиться и так. В итоге у меня должен получиться фид экспорта по заданным критериям. Спасибо за помощь буду пробовать.

Неактивен

 

#24 26.03.2014 23:20:21

Lamener
Участник
Зарегистрирован: 15.03.2014
Сообщений: 18

Re: Запрос на выборку с уловием NOT

vasya написал:

А что по времени с этим вариантом http://sqlinfo.ru/forum/viewtopic.php?pid=39393#p39393 ?

с добавлением в select вместо *, t1.video_id. по времени разницы нет !

Неактивен

 

#25 26.03.2014 23:22:27

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Запрос на выборку с уловием NOT

там в подзапросе отсутствует группировка

Неактивен

 

Board footer

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