2013-06-13 6 views
5

У меня есть таблица каталогов поставщиков в базе данных MySQL, которая имеет сопоставимую таблицу сопоставлений поставщиков. В этой таблице приведены следующие критерии для отдельного поставщика:Выбор MySQL на основе значений ENUM

  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 карты используется для указания типа лица привязывается и 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'); 

, который должен вернуть всех поставщиков, которые имеют ключевую услугу с идентификатором 55, специальность с идентификатором 218 и стандарт с идентификатором 15. Однако он просто возвращает пустой набор результатов, хотя я знаю, что есть хотя бы один поставщик с указанными. Кажется, что это связано с сложными предложениями AND, но не может понять, что.

Буду признателен, если у кого есть идеи?

+0

Можете ли вы создать некоторые примеры данных с вашими таблицами и поместить их в SQL Fiddle? – Kermit

+0

См. Http://sqlfiddle.com/#!2/bddae/2. Надеюсь, это так, как раньше не использовали SQL Fiddle. Если я ищу поставщика с ключевым сервисом = 1, speciality = 1 и стандартным = 3, он должен вернуть обратно Поставщик 1 и Поставщик 4. –

ответ

3

Если вы посмотрите на условия вашего запроса в:

(supplier_mappings.entity_type = 'KEY_SERVICE' И supplier_mappings.entity_id = '55') И (supplier_mappings.entity_type = 'ЭКСКЛЮЗИВ' И supplier_mappings.entity_id = '218') И (supplier_mappings.entity_type = 'СТАНДАРТ' И supplier_mappings.entity_id = '15')

Например: supplier_mappings.entity_type = 'KEY_SERVICE' И supplier_mappings.entity_type = 'ЭКСКЛЮЗИВ' всегда будет возвращать 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'; 
+0

Бинго. Это билет. Приветствия. –

1

Посмотрите на свой булевой логики.В конце концов у вас есть ассоциативная функция ("И")

так это

(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 = 'SPECIALITY' 

и

supplier_mappings.entity_type = 'KEY_SERVICE' 

Ни в коем случае не может быть что-то одновременно. (это также верно для третьего значения, а идентификатор - между прочим). Вы не хотите ВСЕХ этих вещей сразу. Примером может служить случай с simpeler: если вы хотите, чтобы из простой таблицы были строки, содержащие id=3, и строки, которые имеют id=4, ваша логика НЕ ​​была бы WHERE id=3 AND id=4, потому что нет строк, которые имели бы оба. Вместо этого, вы бы попросить WHERE id=3 OR id=4

вместо (я не уверен, что это полностью фиксируя все, но он должен получить вы собираетесь), вы хотите сделать или для этих отдельных случаев:

(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'); 
+0

Использование OR будет работать, но это означает, что он вернет результирующий набор, если какое-либо из этих условий будет соответствовать, мне нужно убедиться, что все условия совпадают. –

+0

Это невозможно, у вас не может быть что-то сразу 2 вещи – Nanne

Смежные вопросы