Этот запрос при индексе (v.fieldID,v.value), что является само-собой разумеющимся, не должен сканировать всё. Да будет temporary table и filesort, но если данных в выборке будет не много, то на скорости это критично не должно сказаться.
Единственное что, я тот запрос ни разу не запускал и он может "не совсем так" работать
[new]
чтоб себе в bookmarks сохранить.
поиск по 2-м свойствам + условие на главной таблице и сортировка по 3-му свойству
known issue: неправильно будет работать, если несколько разных условий по одному fieldID, да и вообще нужно его хорошо затестить.
Код:
SELECT _поля_какие_нужны_
FROM
(
SELECT prop.itemID, prop.ord
FROM
(SELECT v.itemID, (@i:=if(@i is null,@i:=0, 1)+@i) AS ord,
COUNT(DISTINCT v.fieldID) AS cnt
FROM values AS v
JOIN items AS i ON v.itemID=i.itemID
WHERE ((v.fieldID=1 AND v.value=5) OR (v.fieldID=2 AND v.value=10)) AND
i.date_add > '2008-01-01'
GROUP BY v.itemID
HAVING cnt=2
) AS prop
JOIN values AS v2 ON prop.itemID=v2.itemID
WHERE v2.fieldID=3
ORDER BY v2.value DESC
LIMIT 10
) AS t
JOIN items ON items.itemID=t.itemID
JOIN values ON ...
LEFT JOIN fields ON ...
To all
может ещё есть варианты (пока для простоты можно остановиться на 3-х таблицах и без отдельных полей/таблиц под разные типы).