Нужно реализовать выборку из таблицы
Таблица имеет структуру
id | tmplvarid | contentid | value
1 | 23 | 14 | Декомпрессор
2 | 22 | 15 | 50
3 | 22 | 16 | 51
4 | 34 | 17 | Декомпрессор2
tmplvarid - это объект который может иметь разные значения в каждом contentid
Задача стоит выбрать все значения contentid которые соответствуют 3 параметрам и одному диапазону.
Т.е. например нужно выбрать все contentid которые лежат в диапазоне от 45 до 60, и при этом равняются tmplvarid = 22, плюс имеют tmplvarid = 14 a value которого при этом должен иметь значение "Декопрессор"
Знаю, что задача решается посредством Self Join и\или вложенных запросов. Но вот как, понять не могу((
SELECT contentid FROM '.$site_tv_vals.
' WHERE (tmplvarid='.$tempMod[id].' AND value BETWEEN '.$rangeOne[value].' AND '.$rangeTwo[value].')
AND ( tmplvarid='.$powerCurrent[id].' AND value='value1')
AND ( tmplvarid='.$shellCurrent[id].' AND value='value2')
AND ( tmplvarid='.$groipCurrent[id].' AND value='value3')
$powerCurrent[id]
$shellCurrent[id]
$groipCurrent[id]
Это все разные ИД
@Vangor ну вот у Вас стоит задача чтобы все tmplvarid обязательно присутствовали. В IN() Вы пишите все tmplvarid, но IN() вернет результат если хоть одно значение присутствует, для того чтобы проверить присутствуют ли все значения используется HAVING COUNT(DISTINCT tmplvarid) = 2, где 2 это количество значений tmplvarid, таким образом Вы проверяете что все значения tmplvarid присутствуют
@Satanpit Прошу прощения, но все равно не могу понять как это сделать. Вы можете написать пример?
Еще раз напишу что нужно
Примерно так:
SELECT contentid FROM '.$site_tv_vals.
' WHERE (tmplvarid='.$tempMod[id].' AND value BETWEEN '.$rangeOne[value].' AND '.$rangeTwo[value].')
AND ( tmplvarid='.$powerCurrent[id].' AND value='value1')
AND ( tmplvarid='.$shellCurrent[id].' AND value='value2')
AND ( tmplvarid='.$groipCurrent[id].' AND value='value3')
$powerCurrent[id]
$shellCurrent[id]
$groipCurrent[id]
Это все разные ИД
Спасибо за ответ, но -
вот в том то к сожалению и суть(( не может быть OR только AND - т.к. значения должны быть и tmplvarid и value .
Например - представьте что это фильтр в интернет магазине. И мы указываем показать товары у которых:
tmplvarid = 22 и value = 'Декопрессор'
AND
tmplvarid = 23 и value = '65'
tmplvarid = 23 и value = '85' - (диапазон значение т.е.)
AND
tmplvarid = 24 и value = '65'
Поясню, tmplvarid - это параметр фильтра, Допустим такой как мощность, тип покрытия, радиус действия и т.п. value - его значения.
В том что предлагаете вы я получу или 22 или 14 tmplvarid, а надо оба таких ID с определенным значением каждый плюс значения из диапазона.
На самом деле фильтр должен быть гибкий. А это значит лучше предоставлять челорвеку все возможности. При создании фильтров я в основном использую операторы IN и LIKE. Если у вас в магазине не ассортимент IKEA, то скорости исполнения хватает выше крыши. Иначе - нужно использовать не MySQL и тем более не PHP. Но тогда и возможностей реализации намного выше.
В вашем примере используется фраза "равняются tmplvarid = 22, плюс имеют tmplvarid = 14". То есть указанный вами кусок данных будет возвращать именно такие значения.