2017-01-13 18 views
1

Вопрос Как найти строки, которые соответствуют значению в одном столбце (с использованием оператора =) и другому столбцу, должны иметь подстроку (используя find_in_set или другое совпадение подстроки).Извлечь строку из таблицы, которая соответствует значению в одном столбце, и наличие подстроки в разделительной запятой в другом столбце

Сценарий: У меня есть три таблицы: MySQL

1. Цифры: Это есть детали фигур, как идентификатор, имя, создать-на, сотворено на, модифицированных на статус и т.д. для простоты я упомянул только две колонки:

id | name 
1 | red green yellow circle 
2 | red square in yellow circle 
3 | 3D yellow red trapezium 

2. атрибуты: Он хранит различные атрибуты со всеми возможными значениями, разделенными запятой для каждого атрибута.

id | term  | value 
1 | shape | circle,square,rectangle,parallelogram,trapezium 
2 | color | red,green,yellow,blue,white,orange 
3 | dimension | 1D,2D,3D 

3. Рисунок Атрибут Картирование: Он хранит отображение фигуры, атрибуты и только те, разделенную запятая значения, которые применимы к этой конкретной комбинации фигурного атрибута.

id | figure_id | attribute_id | value 
1 | 1   | 1   | circle 
2 | 1   | 2   | red,green,yellow 
3 | 2   | 1   | circle,square 
4 | 2   | 2   | red,yellow 
5 | 3   | 1   | trapezium 
6 | 3   | 2   | yellow,red 
7 | 3   | 3   | 3D 

Цель: Я хочу написать запрос, который возвращает меня figure_id из figure_attribute_mapping таблицы на соответствие значения атрибута в этом atribute фигурой отображения строки.

Дело I: поиск фигуры квадратной формы. Мой запрос:

Select figure_id from figure_attribute_mapping 
where (attribute_id = 1 AND find_in_set('square',value)<>0); 

Ожидаемый ответ: 2 Результат: Положительный

Case II: поиск красный цвет фигуры. Мой запрос:

select figure_id from figure_attribute_mapping 
where (attribute_id = 2 AND find_in_set('red',value)) 

Ожидаемый ответ: 1, 2, 3 Результат: Положительный

Case III: поиск красного цвета квадратной фигуры. Мой запрос:

select figure_id from figure_attribute_mapping 
where 
     (attribute_id = 1 AND find_in_set('square',value)<>0) 
    AND (attribute_id = 2 AND find_in_set('red',value)<>0) 

Ожидаемый ответ: 2 Результат: отрицательный

Case IV: поиск красный квадрат в желтый круг фигуры. Мой запрос:

select figure_id from figure_attribute_mapping 
where 
    ( 
     (attribute_id = 1 AND find_in_set('square',value)<>0) 
    AND (attribute_id = 1 AND find_in_set('circle',value)<>0) 
) 
AND 
( 
     (attribute_id = 2 AND find_in_set('red',value) <>0) 
    AND (attribute_id = 2 AND find_in_set('yellow',value)<>0) 
) 

Ожидаемый ответ: 2 Результат: отрицательный

Я могу найти figure_id когда тип атрибута похож, но не может найти figure_id когда несколько атрибутов приходит вопрос.

Может кто-то помочь в создании запроса mysql.

+0

Вы можете урезать свой вопрос немного? –

+0

@TimBiegeleisen: Извините, я написал большой вопрос, объясняющий все о моей ситуации, просто чтобы убедиться, что я делаю это наилучшим образом. Пожалуйста, спросите, если вы запутались из-за более подробного объяснения. – Sarge

ответ

1

Одним из решений является группировка строк по figure_id и поиск по атрибуту value путем его объединения.

Ниже приведены запросы для каждого из случаев:

Случай I:

SELECT z.* FROM (
    SELECT id, figure_id, GROUP_CONCAT(value) AS merged_value 
    FROM figure_attribute_mapping 
    GROUP BY figure_id 
) z 
WHERE FIND_IN_SET('square', z.merged_value); 

Выход

id  | figure_id | merged_value 
+------+-----------+--------------------------+ 
| 3 |   2 | circle,square,red,yellow 

Случай II:

SELECT z.* FROM (
    SELECT id, figure_id, GROUP_CONCAT(value) AS merged_value 
    FROM figure_attribute_mapping 
    GROUP BY figure_id 
) z 
WHERE FIND_IN_SET('red', z.merged_value); 

Выходной

| id | figure_id | merged_value    | 
+------+-----------+--------------------------+ 
| 1 |   1 | circle,red,green,yellow | 
| 3 |   2 | circle,square,red,yellow | 
| 5 |   3 | trapezium,yellow,red,3D | 

Случай III:

SELECT z.* FROM (
    SELECT id, figure_id, GROUP_CONCAT(value) AS merged_value 
    FROM figure_attribute_mapping 
    GROUP BY figure_id 
) z 
WHERE FIND_IN_SET('square', z.merged_value) 
AND FIND_IN_SET('red', z.merged_value); 

| id | figure_id | merged_value    | 
+------+-----------+--------------------------+ 
| 3 |   2 | circle,square,red,yellow | 

Дело IV:

SELECT z.* FROM (
    SELECT id, figure_id, GROUP_CONCAT(value) AS merged_value 
    FROM figure_attribute_mapping 
    GROUP BY figure_id 
) z 
WHERE FIND_IN_SET('square', z.merged_value) 
AND FIND_IN_SET('circle', z.merged_value) 
AND FIND_IN_SET('red', z.merged_value) 
AND FIND_IN_SET('yellow', z.merged_value); 

Выход

| id | figure_id | merged_value    | 
+------+-----------+--------------------------+ 
| 3 |   2 | circle,square,red,yellow | 
+0

Удивительный, спасибо большое @ Самир. Именно то, что нужно. – Sarge

 Смежные вопросы

  • Нет связанных вопросов^_^