基于ENUM值的MySQL选择

7
我在MySQL数据库中有一个供应商目录表,它有一个相关的供应商映射表。该表将以下标准与单个供应商进行映射:
  1. 服务。
  2. 特长。
  3. 标准。
仅作为背景信息,每个标准都存储在3个对应的单独表中。可以在服务表中列出任何供应商可以提供的所有服务,而映射表则捕获单个供应商提供的服务。供应商可以提供多个服务,因此他们会为他们提供的每个服务创建一个映射。特长和标准也是如此。
我在搜索查询中遇到困难的地方是,用户可以在上述任意一个或全部三个标准中查询供应商列表。例如,他们可以搜索具有服务a、特长b和标准c的供应商。他们不能在服务、特长或标准上搜索多个值。
我的映射表如下:
id int(11) unsigned NOT NULL 
supplier_id int(11) unsigned NOT NULL
entity_type enum('KEY_SERVICE','STANDARD','SPECIALITY') NOT NULL
entity_id int(11) NOT NULL 

在使用entity_type maps时,它用于指示正在映射的实体类型,而entity_id则表示个体实体。

我的查询如下:

SELECT DISTINCT supplier_mappings.supplier_id, suppliers.company_name
FROM supplier_mappings
JOIN suppliers ON suppliers.id = supplier_mappings.supplier_id
WHERE (supplier_mappings.entity_type = 'KEY_SERVICE' AND supplier_mappings.entity_id =    '55')
AND (supplier_mappings.entity_type = 'SPECIALITY' AND supplier_mappings.entity_id = '218')
AND (supplier_mappings.entity_type = 'STANDARD' AND supplier_mappings.entity_id = '15'); 

应该返回所有具有id为55的关键服务、id为218的专业和id为15的标准的供应商。然而,它只返回一个空结果集,即使我知道至少有一个供应商符合这些定义。看起来与复合AND子句有关,但无法确定问题所在。

如果有人有任何想法,将不胜感激。


你能否在SQL Fiddle中创建一些样本数据并将其放入你的表中? - Kermit
如果我搜索一个关键服务=1,专业=1和标准=3的供应商,它应该返回供应商1和供应商4。请参见http://sqlfiddle.com/#!2/bddae/2。希望这样做是正确的,因为以前没有使用过SQL Fiddle。 - Adrian Walls
2个回答

4

如果您查看查询的条件:

(supplier_mappings.entity_type = 'KEY_SERVICE' AND supplier_mappings.entity_id = '55') AND (supplier_mappings.entity_type = 'SPECIALITY' AND supplier_mappings.entity_id = '218') AND (supplier_mappings.entity_type = 'STANDARD' AND supplier_mappings.entity_id = '15')

例如:supplier_mappings.entity_type = 'KEY_SERVICE' AND supplier_mappings.entity_type = 'SPECIALITY' 将始终返回FALSE值。

您必须为每个条件使用单独的表格,如下所示:

SELECT DISTINCT suppliers.ID, suppliers.company_name
           FROM suppliers,
                supplier_mappings mapA,
                supplier_mappings mapB,
                supplier_mappings mapC
          WHERE suppliers.ID = mapA.supplier_id
            AND suppliers.ID = mapB.supplier_id
            AND suppliers.ID = mapC.supplier_id
            AND mapA.entity_type = 'KEY_SERVICE'  AND mapA.entity_id = '55'
            AND mapB.entity_type = 'SPECIALITY'   AND mapB.entity_id = '218'
            AND mapC.entity_type = 'STANDARD'     AND mapC.entity_id = '15';

太好了,就是这个。干杯。 - Adrian Walls

1
请查看您的布尔逻辑。最终您会得到一个关联函数(“AND”)。所以这个。
(supplier_mappings.entity_type = 'KEY_SERVICE' AND supplier_mappings.entity_id =    '55')
AND (supplier_mappings.entity_type = 'SPECIALITY' AND supplier_mappings.entity_id = '218')
AND (supplier_mappings.entity_type = 'STANDARD' AND supplier_mappings.entity_id = '15'); 

只有同时拥有这两个条件的情况下,才会返回true。

supplier_mappings.entity_type = 'SPECIALITY'

"and"
supplier_mappings.entity_type = 'KEY_SERVICE' 

这些东西不可能同时存在。对于第三个值和id也是如此。你不想一次性拥有所有这些东西。举个例子,如果你想从一个简单的表中获取id为3和id为4的行,你的逻辑不应该是WHERE id=3 AND id=4,因为没有行会同时具备两个条件。相反,你应该使用WHERE id=3 OR id=4。
相反(我不确定这是否完全解决了所有问题,但它应该能帮助你),你要针对这些不同的情况进行OR操作。
(supplier_mappings.entity_type = 'KEY_SERVICE' AND supplier_mappings.entity_id =    '55')
OR (supplier_mappings.entity_type = 'SPECIALITY' AND supplier_mappings.entity_id = '218')
OR (supplier_mappings.entity_type = 'STANDARD' AND supplier_mappings.entity_id = '15'); 

使用OR也可以,但这意味着如果任何一个条件匹配,它将返回一个结果集,我需要确保所有条件都匹配。 - Adrian Walls
这是不可能的,你不能让某物同时成为两个东西。 - Nanne

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接