Вопрос по реализации т.н. "универсального каталога" (уже другой вопрос)

Anky

Новичок
SELECT i.iid,
GROUP_CONCAT(IF(v.fid = 'field1',v.value,NULL)),
GROUP_CONCAT(IF(v.fid = 'field2',v.value,NULL)),
....
FROM items AS i
INNER JOIN items_values AS v ON v.iid = i.iid
GROUP BY i.iid
Мульти-типовость полей и т.п. решается элементарно.
И добро пожаловать в мир злыъ BLOB'ов 8)) Но это тоже легко решается после чтения мана.
 

Gas

может по одной?
Я правильно понимаю, что ты предлагаешь сканировать всю немаленькую таблицу items_values при поиске ?
 

Anky

Новичок
А как ты предлагаешь её всю не сканировать? :)

Ну можно в join фильтр по полям добавить - глядишь индексы сработают.
Но в целом да. Именно по этому причине EAV и тормозной, логично.
 

Gas

может по одной?
Этот запрос при индексе (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-х таблицах и без отдельных полей/таблиц под разные типы).
 
Сверху