2015-04-03 3 views
1

Я пытаюсь решить это уже довольно долго, и я, похоже, не могу сделать это сам.Выберите результат, который соответствует всем значениям массива

Я хотел бы сохранить ОПЦИИ, связанные с идентификаторами, и при необходимости получить результаты, соответствующие всем желаемым ОПЦИЯМ. Я думал об этом так:

ID | OPTION 

aaa | 1 
aaa | 2 
aaa | 3 

bbb | 1 
bbb | 2 

ccc | 1 
ccc | 2 
ccc | 5 
ccc | 7 

Идентификатор и ВАРИАНТ являются ИНОСТРАННЫМИ КЛЮЧАМИ.

Окончательный запрос будет выглядеть

options_wanted(1,2,5,7) 
SELECT * FROM main_table 
WHERE crit1=... 
AND crit2=... 
AND (ALL OPTIONS ARE FOUND IN options TABLE) 

Могу ли я заставить это работать, или я должен изменить реализацию?

Что вы предлагаете мне?

EDIT:
Благодаря https://stackoverflow.com/a/7505147/2512108, я почти нашел то, что я хочу.

Его запрос работает, но последний столбец дает только один вариант. Есть ли способ заставить его возвращать ВСЕ варианты, доступные (не только нужные)?

+0

Так что в этом случае вам нужно только ccc? –

+0

Да. Если ccc соответствует всем другим критериям, очевидно, но да – JeanneD4RK

+0

вам нужно 'JOIN'. –

ответ

0

Как состояние: «и опции Характеристики отличаются»

и

«Все опции можно найти в таблице параметров»

Я предполагаю, что у вас есть две таблицы; А именно main_table и options_table

SELECT id, option 
FROM main_table 
WHERE crit1='value1' 
and crit2 = 'value2' 
and id IN(
     SELECT id 
      FROM main_table 
      WHERE option IN (select options from options_table) 
      GROUP BY id 
      HAVING COUNT(*) = (select count(options) from options_table) 

Найти подобный вопрос здесь: SQL selecting rows where one column's value is common across another criteria column

+0

Критерий и параметры разные. Плюс, IN вернет результат, если найден ОДИН матч, мне все они нужны ... – JeanneD4RK

+0

Вы хотите все варианты? (1,2,5,7) Правильно? Позвольте мне изменить мой запрос – Avidan

+0

@ JeanneD4RK Buddy; Проверьте мое редактирование – Avidan

2

Ответ:

select item_id, group_concat(option_id order by option_id asc) options 
    from options 
    where option_id in (1, 2, 3) 
    group by item_id 
    having count(option_id) = 3 

Fiddle: http://sqlfiddle.com/#!9/04f69/3

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

EDIT Нет, я не буду, я ненавижу половину ответа.

select item_id, group_concat(option_id order by option_id asc) options 
    from main_table m 
    inner join options o 
    on m.id = o.item_id 
    where option_id in (1, 2, 3) 
    AND crit1 = 2 
    AND crit2 = 3 
    group by item_id 
    having count(option_id) = 3 

Обновлено скрипку: http://sqlfiddle.com/#!9/45bee/1

И если вы хотите, чтобы вернуть все опции, доступные для элемента, который имеет, как минимум, все необходимые параметры, ваш запрос следующим образом:

select o.item_id, group_concat(o.option_id) options 
    from options o 
    inner join (
    select item_id 
     from main_table m 
     inner join options o 
     on m.id = o.item_id 
     where option_id in (1, 2, 3) 
     AND crit1 = 2 
     AND crit2 = 3 
    group by item_id 
    having count(option_id) = 3 

С окончательной скрипкой здесь: http://sqlfiddle.com/#!9/d60b3/1

0

СДЕЛАНО!Наконец, благодаря Вам

SELECT main_table.*, (SELECT GROUP_CONCAT(feature_id) FROM featuring WHERE main_id = main_table.id) options FROM main_table 
RIGHT JOIN featuring 
    ON main_table.id = featuring.main_id 
WHERE featuring.feature_id IN (WANTEDOPTIONS) 
GROUP BY main_table.id 
HAVING COUNT(DISTINCT featuring.feature_id) = NUMBEROFWANTEDOPTIONS 

Это дает мне всю информацию на основной и все доступные варианты в отличая.
Еще раз спасибо.

+0

Я рад, что у вас есть ответ, но если это будет основано на моей, то будет оценено либо повышенное значение, либо принятый ответ. –

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