2013-06-13 18 views
5

Ho una tabella di directory dei fornitori in un database MySQL che ha una tabella di mapping dei fornitori associati. Questa tabella associa i seguenti criteri a un singolo fornitore:Selezione MySQL basata sui valori ENUM

  1. Servizi.
  2. Specialità
  3. Standards

Solo per informazioni di fondo ciascuno di questi sono valori memorizzati in 3 singole tabelle corrispondenti. Tutti i servizi che possono essere forniti da qualsiasi fornitore sono elencati nella tabella dei servizi e la tabella di mapping acquisisce i servizi offerti da un singolo fornitore. Un fornitore può fornire più di un servizio in modo da disporre di una mappatura per ciascun servizio fornito. Lo stesso vale per specialità e standard.

Dove mi trovo in difficoltà è in una query di ricerca in cui un utente può interrogare un elenco di fornitori su uno o tutti e tre i criteri di cui sopra. Quindi, ad esempio, possono cercare un fornitore con servizio a, specialità be standard c. Non possono cercare i valori multipli su un servizio, specialità o standard

Il mio tavolo mapping è simile al seguente:

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 

Dove viene utilizzato mappe entity_type per indicare il tipo di entità viene mappato e ENTITY_ID indica il entità individuale.

La mia domanda è la seguente:

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'); 

che dovrebbe restituire tutti i fornitori che hanno un servizio di chiave con l'id 55, una specialità con l'id 218 e uno stendardo con l'id 15. Tuttavia solo i rendimenti un set di risultati vuoto anche se so che c'è almeno un fornitore con questi definiti. Sembra che abbia qualcosa a che fare con le clausole AND composte, ma non riesce a capire cosa.

Apprezzerebbero se qualcuno avesse qualche idea?

+0

Puoi creare alcuni dati di esempio con le tue tabelle e inserirle in un SQL Fiddle? – Kermit

+0

Vedere http://sqlfiddle.com/#!2/bddae/2. Spero che sia giusto come non hai mai usato SQL Fiddle. Se cerco un fornitore con un servizio chiave = 1, specialità = 1 e uno standard = 3 deve restituire fornitore 1 e fornitore 4. –

risposta

3

Se si dà un'occhiata alle condizioni di vostra ricerca:

(supplier_mappings.entity_type = 'KEY_SERVICE' E supplier_mappings.entity_id = '55') E (supplier_mappings.entity_type = 'SPECIALITA' E supplier_mappings.entity_id = '218') E (supplier_mappings.entity_type = 'STANDARD' E supplier_mappings.entity_id = '15')

Ad esempio: supplier_mappings.entity_type = 'KEY_SERVICE' E supplier_mappings.entity_type = 'SPECIALITA' torneranno sempre Valore FALSE.

è necessario utilizzare una condizione tavolo foreach separata, come questo

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

Bingo. Questo è il biglietto. Saluti. –

1

Date un'occhiata al vostro logica booleana.Alla fine si ha una funzione associativa ("E")

quindi questo

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

otterrebbe true solo per qualcosa che ha sia

supplier_mappings.entity_type = 'SPECIALITY' 

e

supplier_mappings.entity_type = 'KEY_SERVICE' 

Non c'è modo in cui qualcosa possa essere queste cose allo stesso tempo. (questo vale anche per il terzo valore, e l'id tra l'altro). Non vuoi TUTTE queste cose contemporaneamente. Un esempio potrebbe essere un caso semplificatore: se si desidera da una tabella semplice entrambe le righe che hanno id=3 e le righe che hanno id=4, la tua logica NON sarebbe WHERE id=3 AND id=4, perché non ci sono righe che avrebbero entrambe. Invece, ci si chiede per WHERE id=3 OR id=4

invece (non sono sicuro che questo è completamente fissa tutto, ma dovrebbe farti andare), si vuole fare un OR per questi casi distinti:

(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

L'uso di OR funzionerà ma significa che restituirà un set di risultati se una qualsiasi di queste condizioni corrisponde, devo accertarmi che tutte le condizioni corrispondano. –

+0

che non è possibile, non puoi avere qualcosa da 2 cose contemporaneamente – Nanne