Если у меня есть такая таблица:
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'
или мне просто взять все ID2
s из базы данных и разобраться с помощью PHP?
Или есть какой-то другой способ выбрать данные из таблицы?
Я смотрю на 10000 ID и около 200 объектов, число которых будет очень медленно расти.
Вот еще один способ получить желаемый набор результатов, если вы не собираетесь использовать кучу самостоятельных соединений, тогда вы можете использовать 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
Не уверен, что понимаю, что вы хотите сделать, но я попробую.
Как правило: никогда не получайте ненужные данные из вашей БД. Не выбирайте больше, чем вам нужно, и отбрасывайте результаты в своем коде.
Кажется, что имеет смысл (из того, что я понимаю), разделить вашу таблицу на 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')