我需要找到一种方法来“连接”两个字段(类似于key => value)。 例如,在该查询中,我想仅显示其中的项目(fielddef_id = 4 => fieldval.value =“Documentstéléchargeables”)AND(fielddef_id = 5 => fieldval.value =“Anglais”)。
表fielddef存储密钥 表fieldvalue存储值
但是有很多组合:key = value ...(例如:lang = English,type = 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)
每个项目都有许多自定义字段(例如:“color = red”,“Country = France”等。)
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...)
我只需列出项目WHERE color = red AND Country = FRANCE
示例数据:
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")
答案 0 :(得分:1)
首先, DON' T 将条件放在LEFT JOIN
子句中WHERE
的右表中,它们只应放在{{1}中}。clause。
其次,你的最后一个条件没有意义,并且永远是ON()
,一个字段一次不能超过1个值。
第三,字符串比较应使用单引号FALSE
而非双'
。
最后,你应该使用"
,尝试这样的事情(我假设你必须稍微调整一下):
CONCAT()
答案 1 :(得分:0)
E.g:
SELECT i.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
, v4.value v4_value
, d4.fielddef_id d4_fielddef_id
, v5.value v5_value
, d5.fielddef_id d5_fielddef_id
FROM cms_module_listit2ressources_item i
LEFT
JOIN cms_module_listit2ressources_item_categories ic
ON ic.item_id = i.item_id
LEFT
JOIN cms_module_listit2ressources_category c
ON c.category_id = ic.category_id
LEFT
JOIN cms_module_listit2ressources_fieldval v4
ON v4.item_id = i.item_id
AND v4.value IN ("Documents téléchargeables")
LEFT
JOIN cms_module_listit2ressources_fielddef d4
ON d4.fielddef_id = v4.fielddef_id
AND d4.fielddef_id = 4
LEFT
JOIN cms_module_listit2ressources_fieldval v5
ON v5.item_id = i.item_id
AND v5.value IN ("Anglais")
LEFT
JOIN cms_module_listit2ressources_fielddef d5
ON d5.fielddef_id = v5.fielddef_id
AND d5.fielddef_id = 5
WHERE i.active = 1;