2015-07-05 3 views
0

я есть таблица с 61 записями, где первая являются «атомные» определены с их ID, а другой из них представляют собой комбинации первых 19 записей как этотКак получить комбинации из таблицы?

id pi1 pi2 pi3 
1 1 
2 2 
3 3 
    ... 
19 19 
20 1 13 
21 1 18 
    ... 
24 2 6 
25 2 7 
26 2 7 16 

в веб-страницы У меня есть форма, где пользователь нажимает кнопки, соответствующие атомным записям (например, выбор 2 и 7). когда пользователь отправляет, бэкенд следует рассмотреть вопрос о том, что пользователь нажал 2 и 7, а затем полученный набор должен быть:

id 
2 
7 
25 

24-й строке не должно быть на результат, так как пользователь не нажал ее

, чтобы получить основные записи, я думаю, что это должно быть достаточно

SELECT * 
FROM table 
WHERE id = 2 
OR id = 7 

если больше опций нажата, то запрос будет иметь больше операторов. но для доступа к сложным комбинациям я не знаю, как добиться этого, не получая ненужных записей только потому, что один из вариантов присутствует в одном из Pi (pi1, pi2 или pi3)

+0

Вы можете изменить дизайн стола? Кажется, что-то ужасное. –

+0

@juergen d к сожалению нет ... эти записи используются во многих таблицах, где другая сторона - это записи, которые требуют в основном 3 комбинации (1 атомный и другой комплекс) – tiagomagalhaes

+0

Итак, вы имеете в виду, что вы не можете его изменить потому что дизайн исправлен или вы не знаете, как или не хотите? Если вы можете изменить его вообще, вы можете подумать об этом. –

ответ

0

Действительно лучше изменить структура данных должна иметь таблицу соединений - по одной строке на «новый» идентификатор и по одному на соответствующий идентификатор. Однако у вас есть три столбца.

Я думаю, что это логика вы хотите:

select t.* 
from table t 
where id in (2, 7) or 
     (2 in (pi1, pi2, pi3) and 
     7 in (pi1, pi2, pi3) 
    ); 

Однако, это даст вам идентификатор 26, а также. Исключая это, требуется немного больше работы. В MySQL это должно сделать трюк:

select t.* 
from table t 
where id in (2, 7) or 
     ((2 in (pi1, pi2, pi3)) + 
     (7 in (pi1, pi2, pi3)) 
    ) = ((pi1 is not null) + (pi2 is not null) + (pi3 is not null)) 
+0

у меня есть обходное решение, которое способно делать то, что я хочу, не меняя структуру таблицы, используя временную таблицу ... но у меня все еще есть небольшая ситуация, соединяющая две таблицы ... если бы вы могли посмотреть [новый вопрос] (http://stackoverflow.com/questions/31237247/one-simple-join-is-not-enough-but-another-one-doesnt-output-what-i-want) – tiagomagalhaes

+0

@tiagomagalhaes. , , Этот ответ не требует изменения структуры данных. Это просто предложение, которое упростит последующие запросы. –

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