SQLinfo.ru - Все о MySQL

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

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

Вы не зашли.

#1 23.12.2011 19:17:52

Dr1ks
Участник
Зарегистрирован: 23.12.2011
Сообщений: 5

Помогите верно составить запрос

Добрый день.

Таблица video с такими столбцами
id
category
country
и другими

Таблица category (здесь хранится список категорий)
id
name


В таблице video записи могут принимать значения сразу нескольких категорий, перечисляются в таком виде 1,6,15

Можно ли составить запрос для выборки записей с таблицы video со значением category=15 если там перечислено как я сказал выше?

Неактивен

 

#2 23.12.2011 19:20:03

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Помогите верно составить запрос

select * from video where category=15


?


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#3 23.12.2011 19:24:48

Dr1ks
Участник
Зарегистрирован: 23.12.2011
Сообщений: 5

Re: Помогите верно составить запрос

select * from video where category=15

Ну я как понял таким запросов получу только если в category=15, а если у меня записано так category=1,10,15
В другой записи скажем так category=5,15
Как мне выбрать в этом случаи?

Неактивен

 

#4 23.12.2011 19:25:44

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Помогите верно составить запрос

Брр. Приведите пожалуйста содержимое таблиц и выборку, которую  Вы хотите получить ).


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#5 23.12.2011 19:39:29

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

Re: Помогите верно составить запрос

Видимо

where category=15 or category like '15,%' or category like '%,15,%' or category like '%,15';

Неактивен

 

#6 23.12.2011 19:43:12

Dr1ks
Участник
Зарегистрирован: 23.12.2011
Сообщений: 5

Re: Помогите верно составить запрос

таблица video
http://i5.pixs.ru/storage/2/7/7/1jpg_1070799_3613277.jpg
таблица category
http://i5.pixs.ru/storage/2/8/0/2jpg_5214648_3613280.jpg

Отредактированно Dr1ks (23.12.2011 19:44:16)

Неактивен

 

#7 24.12.2011 00:34:45

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Помогите верно составить запрос

Ну тогда да, либо решение от vasya, либо (что лучше) - заведите лучше таблицу rel_video_category, в которой будут id фильмов и id категорий. Таблица реализует отношение "многие ко многим".

То есть там будут такие значения:
id фильма id категории
1 1
1 2
1 3
2 1
2 2
2 4
3 1
3 5

В это случае запрос такой:
select v.* from video v join rel_video_category rvc on v.id=rvc.film_id where rvc.category_id=15
или (так медленнее, но на небольших объёмах сойдёт и так)
select * from video where id in (select film_id from rel_video_category where category=15)

Отредактированно deadka (24.12.2011 01:09:13)


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#8 24.12.2011 15:14:27

Dr1ks
Участник
Зарегистрирован: 23.12.2011
Сообщений: 5

Re: Помогите верно составить запрос

deadka, vasya спасибо вам за помощь.

Неактивен

 

#9 06.01.2012 16:05:51

Dr1ks
Участник
Зарегистрирован: 23.12.2011
Сообщений: 5

Re: Помогите верно составить запрос

deadka,

почитав документацию я нашёл решение с помощью регулярных выражений

select * from video where category regexp '[[:<:]](15)[[:>:]]'


Этот запрос будет медленнее, чем предложенный выше Вами?

Отредактированно Dr1ks (06.01.2012 16:06:21)

Неактивен

 

#10 06.01.2012 19:58:51

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

Re: Помогите верно составить запрос

Да, он не сможет использовать индексы и будет делать полный скан таблицы.

Неактивен

 

#11 06.01.2012 22:30:50

evgeny
Гуру
Зарегистрирован: 04.05.2009
Сообщений: 335

Re: Помогите верно составить запрос

Значения типа '1,10,15' - зло !
Фулскана не избежать.

Однозначно создавать дополнительную таблицу rel_video_category (про которую писал deadka)

Легко перелить данные с вашей старой таблицы, можно так:

create table `test`.`rel_video_category`( `video_id` int NOT NULL , `category_id` int)  ;

insert into rel_video_category (category_id,video_id)
select category.cat_id 'category_id',video.id 'video_id'
from category,video where CONCAT(',',video.category,',') LIKE CONCAT('%,',category.cat_id,',%');

Неактивен

 

#12 09.01.2012 10:23:00

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Помогите верно составить запрос

vasya написал:

Да, он не сможет использовать индексы и будет делать полный скан таблицы.

И вообще regexp - штука медленная.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

Board footer

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