2013-06-13 22 views
5

Mam tabelę katalogu dostawców w bazie danych MySQL, która ma skojarzoną tabelę mapowania dostawców. Poniższa tabela przedstawia następujące kryteria w odniesieniu do konkretnego dostawcy:Wybieranie MySQL na podstawie wartości ENUM

  1. Usługi.
  2. Specialties
  3. Standardy

Tylko dla informacji tła każdy z nich wartości przechowywane w 3 indywidualnych odpowiednich tabel. Wszystkie usługi, które mogą być świadczone przez dowolnego dostawcę, są wymienione w tabeli usług, a tabela mapowania obejmuje usługi oferowane przez pojedynczego dostawcę. Dostawca może zapewnić więcej niż jedną usługę, aby mieć mapowanie dla każdej świadczonej usługi. To samo dotyczy specjalności i standardów.

Tam, gdzie napotykam na trudności, znajduje się zapytanie, w którym użytkownik może wyszukać listę dostawców na jednym lub wszystkich trzech powyższych kryteriach. Mogą na przykład szukać dostawcy usług z usługą a, specjalnością b i standardem c. Nie można wyszukać wiele wartości na usługi, specjalności lub standardowy

Moje mapowania tabeli wygląda następująco:

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 

Gdzie mapy ENTITY_TYPE służy do wskazania typu jednostki są odwzorowywane i ENTITY_ID wskazuje indywidualny podmiot.

Moje zapytanie brzmi następująco:

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

które powinny powrócić wszystkich dostawców, którzy mają kluczową usługę z identyfikatorem 55, specjalność z identyfikatorem 218 i standardowe z identyfikatorem 15. Jednak to po prostu zwraca pusty zestaw wyników, mimo że wiem, że istnieje co najmniej jeden dostawca z tymi zdefiniowanymi. Wydaje się, że ma to coś wspólnego ze złożonymi klauzulami ORAZ, ale nie może dowiedzieć się, co.

Byłbym wdzięczny, jeśli ktoś ma jakieś pomysły?

+0

Czy możesz utworzyć przykładowe dane ze swoimi tabelami i wstawić je do Fiddle SQL? – Kermit

+0

Zobacz http://sqlfiddle.com/#!2/bddae/2. Mam nadzieję, że to prawda, ponieważ wcześniej nie używałeś SQL Fiddle. Jeśli wyszukuję dostawcę z kluczową usługą = 1, specjalność = 1 i standard = 3, powinien on zwrócić dostawcę 1 i dostawcę 4. –

Odpowiedz

3

Jeśli przyjrzeć się warunkom na zapytanie:

(supplier_mappings.entity_type = 'KEY_SERVICE' AND supplier_mappings.entity_id = '55') I (supplier_mappings.entity_type = 'SPECJALNOŚĆ' I supplier_mappings.entity_id = '218') I (supplier_mappings.entity_type = 'standardowe' I supplier_mappings.entity_id = '15')

Na przykład supplier_mappings.entity_type = 'KEY_SERVICE' I supplier_mappings.entity_type = 'specjalnych' powraca zawsze Wartość FALSE.

Musisz użyć osobnego stanu tabeli foreach, jak to

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. To jest bilet. Twoje zdrowie. –

1

Spójrz na swojej logiczną logiki.W końcu masz asocjacyjną funkcję ("I")

więc

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

wróci prawda tylko o coś, co ma zarówno

supplier_mappings.entity_type = 'SPECIALITY' 

i

supplier_mappings.entity_type = 'KEY_SERVICE' 

Nie ma możliwości, aby coś mogło być tymi rzeczami w tym samym czasie. (Dotyczy to również trzeciej wartości i id w drodze). Nie chcesz WSZYSTKICH tych rzeczy na raz. Przykładem może być przypadek simpeler: jeśli chcesz z prostej tabeli, zarówno wiersze, które mają id=3 i wiersze, które mają id=4, twoja logika NIE będzie WHERE id=3 AND id=4, ponieważ nie ma żadnych wierszy, które miałyby obie. Zamiast tego, można by zapytać o WHERE id=3 OR id=4

zamiast (nie jestem pewien, że to jest całkowicie mocowania wszystko, ale powinno Ci chodzi), którą chcesz zrobić, OR dla tych oddzielnych przypadkach:

(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

Używanie OR zadziała, ale oznacza, że ​​zwróci zestaw wyników, jeśli którykolwiek z tych warunków jest zgodny, muszę się upewnić, że wszystkie warunki są zgodne. –

+0

co nie jest możliwe, nie można mieć czegoś na raz 2 na raz – Nanne

Powiązane problemy