У меня возникли проблемы с динамическим c SQL поисковым запросом, где я хотел бы найти все объекты, в которых есть какие-либо поля, которые я ищу. Ниже приведена структура данных.
objectregister fieldvalue
| id | name | | id | objid | fieldid | value (illustration) |
+----+---------+ +----+---------+---------+------------------------+
| 1 | CUBE | | 1 | 1 | 12 | 4 (BLUE) |
| 2 | SQUARE | | 2 | 2 | 12 | 4 (BLUE) |
| 3 | 1 | 22 | 27 (SMALL) |
| 4 | 2 | 22 | 9 (BIG) |
Испытательный стенд со структурой БД:
CREATE TABLE IF NOT EXISTS `objectregister` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(1024) COLLATE utf8_swedish_ci NOT NULL,
PRIMARY KEY (`id`)
);
INSERT INTO `objectregister` (`id`, `name` ) VALUES
(1, 'CUBE'),
(2, 'SQUARE');
CREATE TABLE IF NOT EXISTS `fieldvalue` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`objid` int(11) NOT NULL,
`fieldid` int(11) NOT NULL,
`value` varchar(2048) COLLATE utf8_swedish_ci NOT NULL,
UNIQUE KEY `id` (`id`)
);
INSERT INTO `fieldvalue` (`id`, `objid`, `fieldid`, `value`) VALUES
(1, 1, 12, 4),
(2, 2, 12, 4),
(3, 1, 22, 27),
(4, 2, 22, 9);
SELECT `id`, `name` FROM `objectregister` WHERE id IN
(
SELECT * FROM
(
SELECT `objid`
FROM `fieldvalue`
WHERE 1 AND ( (fieldvalue.fieldid = '12' AND fieldvalue.value = '4') OR (fieldvalue.fieldid = '22' AND fieldvalue.value = '27') )
GROUP BY objid
) as subquery
)
+----+--------+
| id | name |
+----+--------+
| 1 | CUBE |
| 2 | SQUARE |
+----+--------+
https://rextester.com/XTR72354
Пример:
Я хотел бы найти все объекты, которые синие . В этом случае: CUBE, SQUARE
Я хотел бы найти все объекты, которые синие И большие . В этом случае: SQUARE
Поэтому, я полагаю, мне сначала нужно будет выбрать все возможные objid , которые соответствуют любому поиску в подзапросе. Получите их в одну строку, чтобы я позже мог выбрать, ГДЕ они оба совпадают? Но как мне это сделать? Нужно ли мне несколько SUB запросов союзов? GROUP_CONCAT? Таблица TEMP?
Это текущий этап моего запроса на момент написания (который будет возвращать обе строки в подзапросе, но для внешнего запроса потребуется WHERE):
SELECT `id`, `name` FROM `objectregister` WHERE id IN
(
SELECT * FROM
(
SELECT `objid`
FROM `fieldvalue`
WHERE 1 AND ( (fieldvalue.fieldid = '12' AND fieldvalue.value = '4') OR (fieldvalue.fieldid = '22' AND fieldvalue.value = '27') )
GROUP BY objid
) as subquery
)