SQLinfo.ru - Все о MySQL

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

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

Вы не зашли.

#1 10.09.2009 12:59:50

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

Как выполнить запрос

Есть такая структура БД:

CREATE TABLE IF NOT EXISTS `bd_companys` (
  `comp_id` bigint(20) NOT NULL auto_increment,
  `comp_name` text NOT NULL,
  `comp_comment` text NOT NULL,
  PRIMARY KEY  (`comp_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COMMENT='Компании'  ;

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

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

CREATE TABLE IF NOT EXISTS `bd_comp_data` (
  `comp_id` bigint(20) NOT NULL,
  `data_name` text NOT NULL,
  `data_value` text NOT NULL,
  KEY `comp_id` (`comp_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Данные по компании';

В одной хранятся компании а в другой данные. Как сделать поиск по нескольким параметрам data_name = data_value ? По одному понятно, по всем тоже... а как сделать если нужно 2,3... параметра?

пс. Хранить по меньшей мере 30 столбцов в одной таблице не вижу логичным + хотелось бы гибкости в кол-ве полей...

Отредактированно Chertenok (10.09.2009 13:00:29)

Неактивен

 

#2 10.09.2009 14:41:09

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

Re: Как выполнить запрос

Не понял, в чем вопрос. Хотите хранить названия параметров и из значения, не
указывая в таблице?

SELECT * FROM bd_comp_data
WHERE
(data_name = 'параметр' AND data_value = 'значение') OR
(data_name = 'другой параметр' AND data_value = 'другое значение')


Оно?

Неактивен

 

#3 10.09.2009 14:53:33

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

Re: Как выполнить запрос

paulus написал:

Не понял, в чем вопрос. Хотите хранить названия параметров и из значения, не
указывая в таблице?

именно так, спасибо

а как добавить объединение с первой таблицей? smile

Отредактированно Chertenok (10.09.2009 15:09:36)

Неактивен

 

#4 10.09.2009 15:49:38

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

Re: Как выполнить запрос

FROM bd_comp_data JOIN bd_companys USING (comp_id)

В чем проблема то? smile

Неактивен

 

#5 10.09.2009 16:35:10

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

Re: Как выполнить запрос

paulus написал:

В чем проблема то? smile

Сделать это наиболее правильно wink как советуют профессионалы)

Неактивен

 

#6 10.09.2009 16:54:51

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

Re: Как выполнить запрос

Ну, «в лоб» в данном случае — правильно smile Только индекс на (data_name, data_value) нужен.

Неактивен

 

#7 10.09.2009 17:06:21

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

Re: Как выполнить запрос

paulus написал:

Ну, «в лоб» в данном случае — правильно smile Только индекс на (data_name, data_value) нужен.

На оба поля? А смысл? smile

Неактивен

 

#8 10.09.2009 17:43:46

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

Re: Как выполнить запрос

Потому что у вас условия на два поля. Почитайте http://sqlinfo.ru/forum/viewtopic.php?id=151

Неактивен

 

#9 11.09.2009 10:09:49

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

Re: Как выполнить запрос

vasya написал:

Потому что у вас условия на два поля. Почитайте http://sqlinfo.ru/forum/viewtopic.php?id=151

Код:

ALTER TABLE `bd_comp_data` ADD INDEX ( `data_name` , `data_value` ) ;

так?

Код:

#1170 - BLOB/TEXT column 'data_name' used in key specification without a key length

с "data_name" понятно, сделал varchar(10) ибо достаточно ... теперь ругается на "data_value" ... там точно может быть многобукв smile

Неактивен

 

#10 11.09.2009 10:26:36

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

Re: Как выполнить запрос

укажите ограничение длины индекса

ALTER TABLE `bd_comp_data` ADD INDEX ( `data_name`(10) , `data_value`(10) ) ;

Неактивен

 

#11 11.09.2009 13:33:07

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

Re: Как выполнить запрос

Едем дальше smile

SELECT * FROM `bd_comp_data`
JOIN `bd_companys` USING (comp_id)
WHERE (data_name = 'small_name' AND data_value LIKE '%ооо%')
AND (data_name = 'ruk_fio' AND data_value LIKE '%п%') ;

Дает нулевой результат хотя точно есть соответствия.

Отредактированно Chertenok (11.09.2009 13:44:34)

Неактивен

 

#12 11.09.2009 13:55:36

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

Re: Как выполнить запрос

У вас в таблице `bd_comp_data` 2 поля - data_name и data_value.

Вы пытаетесь выбрать строку, где (data_name = 'small_name' AND data_value LIKE '%ооо%') И (data_name = 'ruk_fio' AND data_value LIKE '%п%'). Естественно соответствия не находит.

Неактивен

 

#13 11.09.2009 14:02:09

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

Re: Как выполнить запрос

vasya написал:

У вас в таблице `bd_comp_data` 2 поля - data_name и data_value.

Вы пытаетесь выбрать строку, где (data_name = 'small_name' AND data_value LIKE '%ооо%') И (data_name = 'ruk_fio' AND data_value LIKE '%п%'). Естественно соответствия не находит.

Хорошо, но мне именно так нужно найти, что бы эти значения были sad 'small_name' LIKE '%ооо%' AND 'ruk_fio' LIKE '%п%' в пределах одной компании

Отредактированно Chertenok (11.09.2009 14:04:32)

Неактивен

 

#14 11.09.2009 14:12:35

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

Re: Как выполнить запрос

В таком контексте логичней иметь 30 столбцов.

Можно конечно извращаться и делать несколько объединений или считать кол-во совпадений через переменную, но смысл?

Неактивен

 

#15 11.09.2009 14:21:05

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

Re: Как выполнить запрос

vasya написал:

В таком контексте логичней иметь 30 столбцов.

Можно конечно извращаться и делать несколько объединений или считать кол-во совпадений через переменную, но смысл?

а если их 60?

плоха...

Неактивен

 

#16 11.09.2009 14:44:06

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

Re: Как выполнить запрос

А что плохого?

Неактивен

 

#17 11.09.2009 14:47:55

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

Re: Как выполнить запрос

vasya написал:

А что плохого?

ИМХО избыточность, плохая расширяемость

Неактивен

 

#18 11.09.2009 14:58:41

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

Re: Как выполнить запрос

А что не так с расширяемостью? Нужно ещё десять полей - добавили и никаких хлопот.

А вот ситуация, когда для разного количества параметров разные запросы, да ещё совершенно невменяемые.. То с расширяемость действительно плохая.

А избыточность, она разве мешает в данном случае?

Неактивен

 

Board footer

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