Мне нужно найти способ «конкатенировать» два поля (что-то вроде key => value). Например, в этом запросе я хочу показывать только те объекты, где (fielddef_id = 4 => fieldval.value = "Documents téléchargeables") AND (fielddef_id = 5 => fieldval.value = "Anglais").Сложный запрос mySQL с совместными и настраиваемыми полями
Таблица fielddef сохраняет ключевые Таблица fieldvalue сохраняет значение
Но есть много комбинаций: ключ = значение ... (например: LANG = английский, тип = downolad)
SELECT item.item_id AS id, item.title AS title, item.active AS active, item_cat.category_id AS cat_id, item_cat.item_id AS item_id, category.category_id, category.category_name as cat_name, category.category_alias as cat_alias
FROM `cms_module_listit2ressources_item` AS item
LEFT JOIN `cms_module_listit2ressources_item_categories` AS item_cat
ON item.item_id = item_cat.item_id
LEFT JOIN `cms_module_listit2ressources_category` AS category
ON item_cat.category_id = category.category_id
LEFT JOIN `cms_module_listit2ressources_fieldval` AS fieldval
ON item.item_id = fieldval.item_id
LEFT JOIN `cms_module_listit2ressources_fielddef` AS fielddef
ON fieldval.fielddef_id = fielddef.fielddef_id
WHERE item.active=1
AND (fielddef.fielddef_id="4" AND fieldval.value IN ("Documents téléchargeables"))
AND (fielddef.fielddef_id="5" AND fieldval.value IN ("Anglais"))
Это упрощенный пример, который позволит вам узнать, что я хочу сделать ... Обратите внимание, что я не могу изменить концепцию базы данных.
TABLE ITEMS Store the ID and Title of an item.
id= INT/Primary/auto_increment
title = VARCHAR (255)
Каждый товар имеет множество настраиваемых полей (например: "цвет = красный", "Страна = Франция", и т.д ..)
TABLE CUSTOM_FIELDNAME Stores the fieldname (definition => example : "Color", "Country")
fielddef_id = INT/PRIMARY/auto_increment
name = VARCHAR(255) (=> ex: Color, Country...)
TABLE CUSTOM_FIELDVALUE stores the field value (example : "red", "France")
item_id => foreign_key to link to the ITEMS TABLE
fielddef_id => foreign_key to link to the CUSTOM_FIELDNAME TABLE
value = VARCHAR(255) (=> ex: red, France...)
мне нужно перечислить только те элементы, где цвет = красный и Country = ФРАНЦИЯ
Примеры Данные:
TABLE ITEMS :
id=1 | Title = "first Item"
id=2 | Title = "A red French Item"
TABLE CUSTOM_FIELDNAME
fielddef_id = 1 | name = "Color"
fielddef_id = 2 | name = "Country"
TABLE CUSTOM_FIELDVALUE
item_id = 1 | fielddef_id = 1 | value = "Blue"
item_id = 1 | fielddef_id = 2 | value = "Germany"
item_id = 2 | fielddef_id = 1 | value = "Red"
item_id = 2 | fielddef_id = 2 | value = "France"
Так что мой запрос выглядит следующим образом:
SELECT items.title AS title
custom_fieldname.name as customName
custom_fieldvalue.value as customValue
FROM `items`
LEFT JOIN `custom_fieldvalue`
ON items.id = custom_fieldvalue.item_id
LEFT JOIN `custom_fieldname`
ON custom_fieldvalue.fielddef_id = custom_fieldname.fielddef_id
WHERE(custom_fieldname.fielddef_id="1" AND custom_fieldvalue.value "Red") AND (custom_fieldname.fielddef_id="2" AND custom_fieldvalue.value "France")
Pls обеспечить некоторый образец данных и ожидаемого результата на основе выборочных данных. В настоящее время ваш вопрос мне непонятен. Если бы я должен был догадаться, вы ищете group_concat(). – Shadow
Принимая во внимание точку Саги о помещении условий LEFT JOIN в предложение ON, одним из вариантов является LEFT JOIN таблицы fielddef и fiedval дважды, один раз для каждого условия. Другой вариант, который медленнее, но легче читать, - это классический синтаксис «MAX (CASE WHEN ...)» типичного сводного запроса. – Strawberry