具有联合和自定义字段的复杂mySQL查询

时间:2016-07-12 09:53:33

标签: mysql

我需要找到一种方法来“连接”两个字段(类似于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")

2 个答案:

答案 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;