С наступающим Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы
MySQL
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
narymsport
0 / 0 / 0
Регистрация: 05.07.2013
Сообщений: 13
1

Выбор характеристик

05.07.2013, 16:46. Просмотров 1684. Ответов 24
Метки нет (Все метки)

Собственно имеется 2 таблицы
Таблица характеристик (название характеристики)
SQL
1
2
3
4
5
6
7
8
9
CREATE TABLE IF NOT EXISTS `my_fields` (
  `id` INT(11) NOT NULL AUTO_INCREMENT,
  `name` VARCHAR(255) DEFAULT NULL,
  `catid` INT(11) DEFAULT NULL,
  `show` tinyint(1) NOT NULL,
  `order` tinyint(11) NOT NULL,
  `selection` tinyint(1) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=102 ;
И уже конечно таблица - значений характеристики.
На 1 товар, по 90 записей.

SQL
1
2
3
4
5
6
7
8
9
CREATE TABLE IF NOT EXISTS `my_features` (
  `fid` INT(11) DEFAULT NULL,
  `feature` VARCHAR(255) DEFAULT NULL,
  `pid` INT(11) DEFAULT NULL,
  `catid` INT(11) NOT NULL,
  KEY `fid` (`fid`),
  KEY `fid_2` (`fid`),
  KEY `feature` (`feature`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

Требуется получить массив, в котором будет (pid - id продукта) где допустим Тип = телефон, Виброзвонок = есть, Модем = есть
Уже у меня есть массив:
(fid = значение)

Как мне запросиком все цепануть? Подскажите решение, пожалуйста.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.07.2013, 16:46
Ответы с готовыми решениями:

Хранение характеристик товаров
Добрый день. Есть проблема с правильной организацией хранения товар в БД....

Методы описания высокоуровневых характеристик транзакций
Всем привет! Пишу курсовую по БД. И в разделе темы столкнулся со сложностью....

Как объединить данные с разным набором характеристик?
Добрый день! Необходима помощь специалистов! Есть необходимость хранить в базе...

Выбор текстового файла и просмотр его характеристик
Здравствуйте, как посмотреть характеристики текстового файла из окна,...

Выбор характеристик для ноута. Бюджет 1000 баксов
Приветствую. Вопрос такой. Какие характеристики должны быть у ноутбука, чтобы...

24
crautcher
2021 / 1993 / 463
Регистрация: 27.05.2011
Сообщений: 6,837
05.07.2013, 17:53 2
join в помощь
0
narymsport
0 / 0 / 0
Регистрация: 05.07.2013
Сообщений: 13
05.07.2013, 18:01  [ТС] 3
Я знаю, что джойн, но не смог сам его грамотно придумать.
0
Crast
70 / 70 / 5
Регистрация: 10.02.2013
Сообщений: 434
06.07.2013, 21:11 4
Не понял что хочет ТС как и что из себя представляет таблица но запрос для телефон, вибразвонок, модем похоже должен быть
MySQL
1
2
3
4
5
6
7
8
SELECT name, max(phone) as phone, max(vibro) as vibro, max(mode) as mode (
SELECT name, 
IF(fid = 1, feature,NULL) as phone,
IF(fid = 2, feature,NULL) as vibro,
IF(fid = 3, feature,NULL) as mode FROM (
SELECT name,fid, feature FROM my_fields a
  JOIN my_features b on b.pid = a.id) jtable ) feattable
GROUP BY name #или id,name
0
narymsport
0 / 0 / 0
Регистрация: 05.07.2013
Сообщений: 13
11.07.2013, 12:01  [ТС] 5
Никак не получается.
Упрострим задачу
SQL
1
2
3
4
5
6
7
8
9
CREATE TABLE IF NOT EXISTS `my_features` (
  `fid` INT(11) DEFAULT NULL,
  `feature` VARCHAR(255) DEFAULT NULL,
  `pid` INT(11) DEFAULT NULL,
  `catid` INT(11) NOT NULL,
  KEY `fid` (`fid`),
  KEY `fid_2` (`fid`),
  KEY `feature` (`feature`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
Естественно так не находит. Выбираю 2х ядерные процессоры и ОС = iOs -)
SQL
1
SELECT pid FROM TABLE WHERE  (fid='32' AND feature='2') && (fid='91' AND feature='iOS')
Естественно находит вот так, но параметров много нужно:
SQL
1
SELECT pid FROM TABLE WHERE  (fid='32' AND feature='2')
Помогите с запросом
0
crautcher
2021 / 1993 / 463
Регистрация: 27.05.2011
Сообщений: 6,837
11.07.2013, 13:58 6
Цитата Сообщение от narymsport Посмотреть сообщение
(fid='32' AND feature='2') && (fid='91' AND feature='iOS')
fid не может одновременно быть 32 и 91. Он может быть одним из них, а не двумя сразу. нужно ИЛИ
1
narymsport
0 / 0 / 0
Регистрация: 05.07.2013
Сообщений: 13
11.07.2013, 14:05  [ТС] 7
Цитата Сообщение от crautcher Посмотреть сообщение
fid не может одновременно быть 32 и 91. Он может быть одним из них, а не двумя сразу. нужно ИЛИ
Спасибо.Я это уже понял.
А как мне тогда сделать? Мне нужно именно И
Получить id товаров где и 2 ядра и операционка iOs, ну и в перспективе поиск по 20-30 описаниям нужно.
Там только И нужно.
Я могу конечно сделать сразу 20 запросов и потом сортировать как массив, но это очень грузит БД.
0
crautcher
2021 / 1993 / 463
Регистрация: 27.05.2011
Сообщений: 6,837
11.07.2013, 14:42 8
Разные поля могут иметь разные значения одновременно, одно поле не может быть равно двум значениям.
MySQL
1
SELECT `pid` FROM TABLE WHERE  (`fid`='32' AND `feature`='2') OR (`fid`='91' AND `feature`='iOS')
Добавлено через 4 минуты
(a) или (б) = true когда ЛИБО А, ЛИБО Б, ЛИБО А И Б истенны
(a) и (б) = true когда А И Б истенны; если одно из них ложь, то выражение ложно

твое выражение:
MySQL
1
(fid='32' AND feature='2') AND (fid='91' AND feature='iOS')
предположим что fid равно '32' , а feature равно '2' тогда первая скобка будет иснтаннена, а вторая ложна
MySQL
1
(true) && (false)
выходит что выражение ложно - оно всегда будет ложно
0
narymsport
0 / 0 / 0
Регистрация: 05.07.2013
Сообщений: 13
11.07.2013, 14:45  [ТС] 9
Цитата Сообщение от crautcher Посмотреть сообщение
Разные поля могут иметь разные значения одновременно, одно поле не может быть равно двум значениям.
MySQL
1
SELECT `pid` FROM TABLE WHERE  (`fid`='32' AND `feature`='2') OR (`fid`='91' AND `feature`='iOS')
Добавлено через 4 минуты
(a) или (б) = true когда ЛИБО А, ЛИБО Б, ЛИБО А И Б истенны
(a) и (б) = true когда А И Б истенны; если одно из них ложь, то выражение ложно

твое выражение:
MySQL
1
(fid='32' AND feature='2') AND (fid='91' AND feature='iOS')
предположим что fid равно '32' , а feature равно '2' тогда первая скобка будет иснтаннена, а вторая ложна
MySQL
1
(true) && (false)
выходит что выражение ложно - оно всегда будет ложно
Да, спасибо я это понял.
Помогите как мне решить мою поставленную задачу 1 запросом.
Буду очень благодарен.

PS: 5$ пришлю по вебмани
0
crautcher
2021 / 1993 / 463
Регистрация: 27.05.2011
Сообщений: 6,837
11.07.2013, 14:53 10
Цитата Сообщение от narymsport Посмотреть сообщение
Помогите как мне решить мою поставленную задачу 1 запросом.
ну а
Цитата Сообщение от crautcher Посмотреть сообщение
MySQL
1
SELECT `pid` FROM TABLE WHERE (`fid`='32' AND `feature`='2') OR (`fid`='91' AND `feature`='iOS')
что не работает?
0
narymsport
0 / 0 / 0
Регистрация: 05.07.2013
Сообщений: 13
11.07.2013, 15:00  [ТС] 11
Цитата Сообщение от crautcher Посмотреть сообщение
что не работает?
Мне нужно получить id продуктов где.

fid - это id характеристики
feature - сама характеристика.

Мне нужно получить id всех товаров у которых есть процессор 2 ядра, и операционная система iOS
а не ИЛИ
0
Crast
70 / 70 / 5
Регистрация: 10.02.2013
Сообщений: 434
11.07.2013, 15:03 12
narymsport ванги здесь нет, что означает поле fid и поле feature, для чего они нужны, и что ты хочешь получить (таблицы для примера, чтобы понятно было).

Добавлено через 51 секунду
Цитата Сообщение от narymsport Посмотреть сообщение
fid - это id характеристики
feature - сама характеристика.
А почему feature ты вычисляешь как цифру? Я вообще думал сначала на имя.
0
narymsport
0 / 0 / 0
Регистрация: 05.07.2013
Сообщений: 13
11.07.2013, 15:06  [ТС] 13
SQL
1
2
3
4
5
6
7
8
9
CREATE TABLE IF NOT EXISTS `my_features` (
  `fid` INT(11) DEFAULT NULL,
  `feature` VARCHAR(255) DEFAULT NULL,
  `pid` INT(11) DEFAULT NULL,
  `catid` INT(11) NOT NULL,
  KEY `fid` (`fid`),
  KEY `fid_2` (`fid`),
  KEY `feature` (`feature`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
fid - id - названия характеристики, которая хранится в другой таблице
feature - сам текст характеристики
pid - id продукта который нужно получить
catid - для удобства сделал себе.

У меня есть уже четкий массив с данными:
32 => 2
92 => iOs

Естественно fid = 32 в другой таблице это " Количество ядер процессора", а 92 - это Операционная система
0
Crast
70 / 70 / 5
Регистрация: 10.02.2013
Сообщений: 434
11.07.2013, 15:15 14
Можно декартовым произведением вытащить, но это очень плохо, когда у тебя будет множество значений, тогда много таких произведений дадут тормоза.
MySQL
1
2
3
SELECT pid FROM TABLE as a
   JOIN TABLE as b 
     ON a.fid=32 and a.feature='2' and b.fid=91 and b.feature='iOS' and a.pid=b.pid
Добавлено через 24 секунды
и опять зарезервированные слова

Добавлено через 24 секунды
вместо table очевидно my_feature

Добавлено через 4 минуты
Лучше сделать как я в начале говорил, тогда не будет кучи произведений
MySQL
1
2
3
4
5
6
7
SELECT pid FROM (
SELECT pid,
   max(IF(fid=32,feature,NULL)) as cores,
   max(IF(fid=91,feature,NULL)) as OS
FROM my_features
GROUP BY pid) as y
WHERE cores='2' and OS ='iOS'
Во внутреннем запросе можно для скорости сделать where feature = .
0
narymsport
0 / 0 / 0
Регистрация: 05.07.2013
Сообщений: 13
11.07.2013, 15:16  [ТС] 15
Спасибо, в течении часа попробую, отпишусь.
А как вообще в таких ситуациях поступить грамотно?
На 3500 товаров, в таблице характеристик почти 200 тыс записей, и это только 1 категория магазина.

Добавлено через 38 секунд
>Лучше сделать как я в начале говорил, тогда не будет кучи произведений

Понимаете, алиасы нужно будет руками задавать, можно без никак как то?
Просто они на русском языке)
0
crautcher
2021 / 1993 / 463
Регистрация: 27.05.2011
Сообщений: 6,837
11.07.2013, 15:19 16
А, понял теперь вроде
MySQL
1
2
3
4
5
6
7
8
9
10
mysql> explain my_features;
+---------+--------------+------+-----+---------+-------+
| Field   | Type         | Null | Key | Default | Extra |
+---------+--------------+------+-----+---------+-------+
| fid     | int(11)      | YES  | MUL | NULL    |       |
| feature | varchar(255) | YES  | MUL | NULL    |       |
| pid     | int(11)      | YES  |     | NULL    |       |
| catid   | int(11)      | NO   |     | NULL    |       |
+---------+--------------+------+-----+---------+-------+
4 rows in set (0.03 sec)
закинем какихто данных для теста
MySQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
mysql> insert into my_features(fid , feature, pid , catid) values ('1', 'iOS', 666 , 1 );
Query OK, 1 row affected (0.02 sec)
 
mysql> insert into my_features(fid , feature, pid , catid) values ('32', '2', 666 , 1 );
Query OK, 1 row affected (0.00 sec)
 
mysql> insert into my_features(fid , feature, pid , catid) values ('32', 'iOS', 666 , 1 );
Query OK, 1 row affected (0.00 sec)
 
mysql> select * from my_features;
+------+---------+------+-------+
| fid  | feature | pid  | catid |
+------+---------+------+-------+
|    1 | iOS     |  666 |     1 |
|   32 | 2       |  666 |     1 |
|   32 | iOS     |  666 |     1 |
+------+---------+------+-------+
3 rows in set (0.00 sec)
выберем количество записей рядом подходящих под условие
MySQL
1
2
3
4
5
6
7
mysql> SELECT `pid` , count(*) FROM `my_features` WHERE (`fid`='32' AND `feature`='2') OR (`fid`='91' AND `feature`='iOS') group by `pid`;
+------+----------+
| pid  | count(*) |
+------+----------+
|  666 |        1 |
+------+----------+
1 row in set (0.00 sec)
подберем условия что-бы сымитировать совпадение по двум полям
MySQL
1
2
3
4
5
6
7
mysql> SELECT `pid` , count(*) FROM `my_features` WHERE (`fid`='32' AND `feature`='2') OR (`fid`='32' AND `feature`='iOS') group by `pid`;
+------+----------+
| pid  | count(*) |
+------+----------+
|  666 |        2 |
+------+----------+
1 row in set (0.00 sec)
добавим еще одну запись, чтобы она подходило только по одному полю
MySQL
1
2
3
4
5
6
7
8
9
10
11
mysql> insert into my_features(fid , feature, pid , catid) values ('32', 'iOS', 777 , 1 );
Query OK, 1 row affected (0.00 sec)
 
mysql> SELECT `pid` , count(*) FROM `my_features` WHERE (`fid`='32' AND `feature`='2') OR (`fid`='32' AND `feature`='iOS') group by `pid`;
+------+----------+
| pid  | count(*) |
+------+----------+
|  666 |        2 |
|  777 |        1 |
+------+----------+
2 rows in set (0.00 sec)
выбираем только те, которые подходят по двум полям
MySQL
1
2
3
4
5
6
7
8
9
mysql> SELECT `pid` , count(*) FROM `my_features` WHERE (`fid`='32' AND `feature`='2') OR (`fid`='32' AND `feature`='iOS') group by `pid` having count(*) > 1;
+------+----------+
| pid  | count(*) |
+------+----------+
|  666 |        2 |
+------+----------+
1 row in set (0.00 sec)
 
mysql>
0
narymsport
0 / 0 / 0
Регистрация: 05.07.2013
Сообщений: 13
11.07.2013, 17:17  [ТС] 17
crautcher ваш пример разберу чуть позже.
Спасибо, отпишусь.

Добавлено через 1 час 49 минут
crautcher ваш вариант работает только при 2х сравнениях.
а если добавить еще какой нибудь параметр , то уже ничего не ищется.

Добавлено через 2 минуты
Crast, а ваш вариант я вообще не понял как добавлять еще характеристики

Добавлено через 3 минуты
(fid='32' AND feature='1') OR (fid='5' AND feature='iOS 4') OR (fid='26' AND feature='3.5 мм')

Уже не работает...
0
crautcher
2021 / 1993 / 463
Регистрация: 27.05.2011
Сообщений: 6,837
11.07.2013, 17:29 18
Цитата Сообщение от crautcher Посмотреть сообщение
MySQL
1
having count(*) > 1;
ну так количество условий надо менять при добавлении нового
0
narymsport
0 / 0 / 0
Регистрация: 05.07.2013
Сообщений: 13
11.07.2013, 17:35  [ТС] 19
Попробовал по примеру Crasta:

Fatal error: DB: 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 '`pole1`='2' AND `pole2`='iOS 4'' at line 6. Full query:

SQL
1
 SELECT pid FROM ( SELECT pid, MAX (IF(fid=32,feature,NULL)) AS pole0, MAX (IF(fid=5,feature,NULL)) AS pole1 FROM my_features GROUP BY pid) AS y `pole1`='2' AND `pole2`='iOS 4'
Добавлено через 2 минуты
Цитата Сообщение от crautcher Посмотреть сообщение
ну так количество условий надо менять при добавлении нового
Оно всегда будет >1 ...
0
crautcher
2021 / 1993 / 463
Регистрация: 27.05.2011
Сообщений: 6,837
11.07.2013, 17:40 20
Цитата Сообщение от narymsport Посмотреть сообщение
Оно всегда будет >1 ...
ну и что, что больше одного будет всегда - нужно точное совпадение количества условий
1
11.07.2013, 17:40
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.07.2013, 17:40

"Выбор". Вычисление характеристик треугольника
Привет всем:) Помогите написать программу. Заранее спасибо!

План видов характеристик в качестве характеристики значения плана видов характеристик
всем привет. я вроде как чета понимаю в 1с и казалось бы херли там план видов...

Инкапсуляция характеристик
Основы ООП. В задании требуется инкапсулировать все характеристики класса и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru