6

我在 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 子句有关,但无法弄清楚是什么。

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

4

2 回答 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 supply_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';
于 2013-06-13T13:31:09.413 回答
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'

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'); 
于 2013-06-13T13:57:15.053 回答