Вертикальный выбор данных в таблице MySQL

Если у меня есть такая таблица:

ID color size weight
1  red   2    3
2  green 4    5

Таким образом, чтобы выполнить запрос MySQL, чтобы найти ID число, которое color:red а также size:2 а также weight:3 Я могу сделать это:

select ID from table where color=red AND size=2 AND weight=3

Поскольку в дополнение к цвету, весу, размеру, пробегу, скорости и т. Д. Растут свойства, и я хочу, чтобы таблица масштабировалась, было бы целесообразно организовать ее таким образом.

ID  ID2  property  value
1   1    color     red
2   1    size      2
3   1    weight    3
4   2    color     green
5   2    size      4
6   2    weight    5

Как мне выполнить запрос на выборку здесь, чтобы найти ID число, которое color:red а также size:2 а также weight:3

Должен ли я создать группу самостоятельных соединений, как предложено здесь:

select t.id2
from test t
join test t1 on(t.id = t1.ID2)
join test t2 on(t.id = t2.ID2)
where t.property = 'color'
and t1.property = 'size'
and t2.property = 'weight'
and t.value = 'red'
and t1.value = '2'
and t2.value = '3'

или мне просто взять все ID2s из базы данных и разобраться с помощью PHP?

Или есть какой-то другой способ выбрать данные из таблицы?

Я смотрю на 10000 ID и около 200 объектов, число которых будет очень медленно расти.

2

Решение

Вот еще один способ получить желаемый набор результатов, если вы не собираетесь использовать кучу самостоятельных соединений, тогда вы можете использовать in(),count(distinct) and group by и я предполагаю для каждого id2 у вас есть уникальные свойства

select t.id2
from test t
where t.property in('color','size','weight')
and t.value in('red','2','3')
group by t.id2
having count(distinct t.property) = 3

Выше запрос будет искать property Столбец для предоставленных значений и подсчета с отличной частью = 3 обеспечит совпадение всех предоставленных пар ключ / значение, поэтому, если ваши свойства вырастут с 3, вы должны указать no. который будет равен нет. свойств, чтобы соответствовать то есть для случая t.property in('color','size','weight','test') счетная часть изменится на having count(distinct t.property) = 4

DEMO

1

Другие решения

Не уверен, что понимаю, что вы хотите сделать, но я попробую.

Как правило: никогда не получайте ненужные данные из вашей БД. Не выбирайте больше, чем вам нужно, и отбрасывайте результаты в своем коде.

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

таблица предметов (предметов)

ID name
1  item 1
2  item 2

опорный стол (реквизит)

itemID name  value
1       color red
1       size  2
2       color blue
2       size  3

Чтобы получить все синие предметы размером 2, вы можете выполнить запрос в форме:

Select name
from items
join props as colors on items.id = colors.itemId
join props as sizes on items.id = sizes.itemId
where (colors.name = 'color' and colors.value = 'blue')
and (sizes.name = 'size' and sizes.value = '2')
0

По вопросам рекламы [email protected]