MySQL pomoc w znalezieniu optymalnego zapytania

0

Hej, mam problem z wymyślaniem zapytania. Otóż dla przykładu posiadam tabelę:

id| attr1 | attr2 | type
1   ABC     GE     man
2   ABC      2      enc
3   CBA     GE     man
4   ACB      3      lok
5   ACB     AD     bol

I teraz muszę wybrać takie attr1, gdzie

type = "man" and attr2 ="GE" and type="enc" and attr2="2"
 

Niestety ta kwerenda nigdy nic nie zwróci:

 
SELECT * FROM table WHERE type = "man" and attr2 ="GE" and type="enc" and attr2="2";
0

jakim cudem attr2 może być równocześnie równe "GE" i "2" ?
to samo masz w warunku na pole TYP
może chodzi o coś takiego

SELECT * FROM table WHERE (type = "man" or type="enc") and (attr2 ="GE" or attr2="2");

napisz dokładniej co chcesz uzyskać, bo Twój warunek w zapytaniu ZAWSZE da pusty zbiór wynikowy

0

Ja mysle że o to Ci chodzi:

SELECT * FROM table WHERE (type = "man" and attr2 ="GE") or (type="enc" and attr2="2");
0

I właśnie w tym problem, że tabela jest dość specyficzna i ciężko jest mi wydobyć to co bym chciał. Ogólnie zapytanie ma na celu przefiltrowanie produktów według zadanych kryteriów przez użytkownika. Np. użytkownik wybiera, że parametr produktu **man ** ma wartość GE, a parametr enc ma wartość 2.

W kolumnie attr1 znajdują się numery katalogowe produktów, kolumna attr2 posiada wartość wybranego parametru użytkownika, natomiast kolumna type jest ściśle powiązana z kolumną attr2 i w niej znajduje się nazwa tego parametru.

Podsumowując, użytkownik wybrał:

man = GE
enc = 2
 

Mając te dane muszę wydobyć numery katalogowe produktów z kolumny attr1.

0

to @Panczo wyczuł o co Ci chodzi i podał właściwe zapytanie

0
Panczo napisał(a):

Ja mysle że o to Ci chodzi:

SELECT * FROM table WHERE (type = "man" and attr2 ="GE") or (type="enc" and attr2="2");

Już szedłem tą drogą, niestety wynik nie będzie taki jaki potrzebuję. Takie zapytanie zwróci mi produkty, które mają man="GE" oraz enc="2". I problem pojawia się wtedy gdy w odpowiedzi dostanę produkt, który będzie miał np. man="GE" ale enc="5". Mechanizm powinien zawężać wyszukiwanie czyli wybrałem man="GE", to teraz muszę z tego wyniku znaleźć takie produkty, które mają enc="2" itd...

Cały dzień myślę jak to ugryźć, aż skapitulowałem i podzieliłem się problemem.

0

jeżeli znasz liczbę par to można to trochę oszukać:

SELECT 
    attr1 
FROM 
    TABLE 
WHERE 
    (TYPE = "man" AND attr2 ="GE") 
    OR (TYPE="enc" AND attr2="2") 
group by 
    attr1 
having 
     count(*)=2;

lub zrobić pivota:

SELECT attr1 
FROM   (SELECT attr1, 
               Max(CASE 
                     WHEN type = 'man' THEN attr2 
                     ELSE NULL 
                   end) AS man, 
               Max(CASE 
                     WHEN type = 'enc' THEN attr2 
                     ELSE NULL 
                   end) AS enc, 
               Max(CASE 
                     WHEN type = 'lok' THEN attr2 
                     ELSE NULL 
                   end) AS lok, 
               Max(CASE 
                     WHEN type = 'bol' THEN attr2 
                     ELSE NULL 
                   end) AS bol 
        FROM   tabela 
        GROUP  BY attr1) pvtT 
WHERE  man = 'GE' 
       AND enc = 2 

DO TESTÓW: http://sqlfiddle.com/#!2/deb146/7/0

0

co to znaczy
man="GE" oraz enc="2" ???
man , ge,enc,2 to zupełnie różne wartości jakichś pól w tabeli i nigdy nie będą równe

0
grzegorz_so napisał(a):

co to znaczy
man="GE" oraz enc="2" ???
man , ge,enc,2 to zupełnie różne wartości jakichś pól w tabeli i nigdy nie będą równe

Tak, zgadza się, dlatego trzeba na to spojrzeć szerzej i jakoś to posklejać. Nie traktuj tego man, ge, enc, 2 jako kolumny. Niestety taką mam tabelę i muszę sobie z nią jakoś radzić.
@Panczo - stestuje Twoje rozwiązanie, dzięki za pomoc.

0

@grzegorz_so nie rozumiesz istoty załóż że masz w tabeli opisy przedmiotów np. laptopy i tabela przechowuje info o ilości RAM i procesorze:

attr1,attr2,type
laptop1, 4 GB, RAM
laptop1, i5, CPU
laptop2, 4 GB, RAM
laptop2, i7, CPU

Wybierze teraz z tego takie które maja i5 i 4 GB RAM, z moją alternatywą dostaniesz oba co nie jest zgodne z prawdą...

0

trudno wybrać bo masz źle zbudowaną bazę

przepraszam, chyba już łapię logikę bazy
dobry przykład

0
grzegorz_so napisał(a):

trudno wybrać bo masz źle zbudowaną bazę

przepraszam, chyba już łapię logikę bazy
dobry przykład

Zanim ja załapałem co klient ode mnie oczekuje i jaką mi daje bazę, też nie mogłem tego skumać. Problem się robi jak baza ma 13 mln rekordów i ponad 40 atrybutów do filtrowania :)

0

czyli EAV model ..

0
SELECT DISTINCT attr1 FROM table AS t1
INNER JOIN table AS t2 ON t1.attr1 = t2.attr1
WHERE t1.type='man' AND t1.attr2='GE' AND t2.type='enc' AND t2.attr2='2'

1 użytkowników online, w tym zalogowanych: 0, gości: 1