Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: żółty kwaśny owoc...
Forum PHP.pl > Forum > Bazy danych > MySQL
yoyo
mam taką przykładową tabelę:

Kod
-----------------------------------------

| owoc        | cecha    | wartosc      |

-----------------------------------------

| cytryna     | kolor    | żółty        |

| cytryna     | smak     | kwaśny       |

| pomarańcza  | kolor    | pomarańczowy |

| pomarańcza  | smak     | słodki       |

| banan       | kolor    | żółty        |

| banan       | smak     | słodki       |

| kiwi        | kolor    | zielony      |

| kiwi        | smak     | kwaśny       |

-----------------------------------------


i przykładowo chciałbym znaleźć wszystkie żółte i zarazem kwaśne owoce
(czyli w tym przypadku wynikiem powinna być cytryna)

czy istnieje możliwość, aby wyszukać dany owoc za jednym zapytaniem, mam mysql.
Jeśli nie, to jak najlepiej zoptymalizować takie zapytanie.

Czemu wybrałem takie rozwiązanie? cechy nie są stałymi wartościami, a nie chcę
też aby skrypt modyfikował strukturę tabeli.

ps: sorry, za tytuł topicu, ale wie wiedziałem jak to nazwać...
scanner
[sql:1:5ead93cf9a]SELECT owoc FROM tabela WHERE (cecha = 'kolor' AND wartosc = 'żółty') AND (cecha = 'smak' AND wartosc = 'kwaśny') [/sql:1:5ead93cf9a]
Jabol
nie wiem, czy mysql też to ma, ale w postgresie jest coś takiego jak anonimowy widok (chyba tak to się nazywa). I robi się to tak:
Kod
SELECT * FROM ( SELECT * FROM tabela WHERE cos = cos ) AS temp WHERE cos = cos
Czyli u Ciebie byłoby
Kod
SELECT owoc FROM (SELECT * FROM owoce WHERE cecha = 'smak' AND wartosc='kwasny') AS smaki, (SELECT * FROM owoce WHERE cecha='kolor'  AND wartosc='zolty') AS kolory WHERE smaki.owoc=kolory.owoc
Powinno działać, ale nie ręcze (nie sprawdzałem) i nie wiem jak będzie s MySQL'em (może ma taką podobną możliwość).

@scanner: Jesteś pewien, że to działa bo mi się nie wydaje... :/
lukaswoj
Wg wiedzy, która posiadam powiedziałbym, że Jabol bredzi winksmiley.jpg a scanner ma racje.

Przykłady, które podał jabol zawierają sub/pod-zapytania, których mySQL nie obsługuje, postgresql tak.

Zapytanie scannera, wg mnie daje rade w 100% smile.gif
yoyo
Cytat
Wg wiedzy, która posiadam powiedziałbym, że Jabol bredzi winksmiley.jpg a scanner ma racje.

Przykłady, które podał jabol zawierają sub/pod-zapytania, których mySQL nie obsługuje, postgresql tak.


ja mam mysql 3, więc podzapytania faktycznie odpadają

Cytat
Zapytanie scannera, wg mnie daje rade w 100% smile.gif


no niestety tak se ne da...

aby ułatwić testowanie pozwolę sobię wkleić strukturę tabeli do mojego przykładu (bez ogonków):
[sql:1:80f15ceb40]
CREATE TABLE `owoce` (
`owoc` varchar(16),
`cecha` varchar(16),
`wartosc` varchar(16)
);

INSERT INTO `owoce` ( `owoc`, `cecha`, `wartosc` )
VALUES
("cytryna", "kolor", "zolty"),
("cytryna", "smak", "kwasny"),
("pomarancza", "kolor", "pomaranczowy"),
("pomarancza", "smak", "slodki"),
("banan", "kolor", "zolty"),
("banan", "smak", "slodki"),
("kiwi", "kolor", "zielony"),
("kiwi", "smak", "kwasny");
[/sql:1:80f15ceb40]
lukaswoj
Oops smile.gif
Pospieszyłem się, troche, rzeczywiście.
Zwracam honor smile.gif

Znalazłem rozwiązanie:
[sql:1:d6ad107dc6]
SELECT owoc, count(*) as ile
FROM owoce
WHERE (cecha = 'kolor' AND wartosc = 'zolty') OR (cecha = 'smak' AND wartosc = 'kwasny') GROUP BY owoc HAVING(ile = 2);
[/sql:1:d6ad107dc6]

W kaluzuli HAVING musiałbyś zmieniać tą dwójkę na liczbę, cech wg, których szukasz.
FiDO
Mozna tez uniwersalniej, dla dowolnej ilosci cech:
[sql:1:4539cffae5]SELECT
o1.owoc,
o1.wartosc kolor,
o2.wartosc smak
FROM owoce o1
INNER JOIN owoce o2 ON (o1.owoc = o2.owoc AND o2.cecha = 'smak')
WHERE o1.cecha = 'kolor'
HAVING kolor = 'zolty' AND smak = 'kwasny'[/sql:1:4539cffae5]
Jabol
a widziecie... mówiłem (że tamto nie działa). I nie użyłem subzapytań, ale anonimowych widoków (to jest coś innego, żeby to zrozumieć musielibyście wiedzieć co to jest widok. A anonimowy to taki, który deklaruje się w samym zapytaniu).
Natomiast FiDO zrobił dokładnie to samo co ja, ale w trozskę inny sposób (połączył obydwie tabele, tak, że teraz jeden rekord ma 5 pól (w tym dwie różne cechy ich wartość i nazwe owocu) i potem zrobił having). U mnie natomiast było połączenie dwóch przefiltrowanych (już zostały tylko żółte albo kwaśne) tabel (a raczej widoków) z których jedna zawiera kolory a druga smaki i znalezienie owoców, które spęłniają obie te warunki.
yoyo
Jabol, faktycznie widzę teraz o co chodzi, ale to niestety po prostu nie działa na mysql3... nie wiem jak to nazwać, ale dla mnie tą SĄ podzapytania
cboot
Cytat
Jabol, faktycznie widzę teraz o co chodzi, ale to niestety po prostu nie działa na mysql3... nie wiem jak to nazwać, ale dla mnie tą SĄ podzapytania

Bo to są podzapytania :? Żeby zdefiniować widok musisz posłużyć się zapytaniem. Jak zdefiniujesz go osobno, to masz osobne zapytanie, a jak zdefiniujesz go wewnątrz innego zapytania, to masz podzapytanie definijuące widok (anonimowy w tym przypadku). Jabol po prostu zakręcił i bredzi tongue.gif :wink: i tyle. To tak samo jakby walnął jakiegokolwiek selecta wewnątrz innego zapytania i tłumaczył się, że to nie jest subzapytanie tylko np. zliczenie pól w innej tabeli, itp, analogiczna argumentacja biggrin.gif
Jabol
no tak, w sumie racja, to są podzapytania. W tym jednak miejscu można dokładniej sprecyzować do czego służą. Ale racja, więcej nie mydle.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.