Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> żółty kwaśny owoc...
yoyo
post
Post #1





Grupa: Zarejestrowani
Postów: 29
Pomógł: 0
Dołączył: 20.12.2003
Skąd: Bielsko-Biała

Ostrzeżenie: (0%)
-----


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ć...
Go to the top of the page
+Quote Post
scanner
post
Post #2





Grupa: Zarząd
Postów: 3 503
Pomógł: 28
Dołączył: 17.10.2002
Skąd: Wrocław




[sql:1:5ead93cf9a]SELECT owoc FROM tabela WHERE (cecha = 'kolor' AND wartosc = 'żółty') AND (cecha = 'smak' AND wartosc = 'kwaśny') [/sql:1:5ead93cf9a]
Go to the top of the page
+Quote Post
Jabol
post
Post #3





Grupa: Przyjaciele php.pl
Postów: 1 467
Pomógł: 13
Dołączył: 22.02.2003

Ostrzeżenie: (0%)
-----


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... :/
Go to the top of the page
+Quote Post
lukaswoj
post
Post #4





Grupa: Zarejestrowani
Postów: 136
Pomógł: 0
Dołączył: 2.01.2004
Skąd: Lublin

Ostrzeżenie: (0%)
-----


Wg wiedzy, która posiadam powiedziałbym, że Jabol bredzi (IMG:http://forum.php.pl/style_emoticons/default/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% (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
yoyo
post
Post #5





Grupa: Zarejestrowani
Postów: 29
Pomógł: 0
Dołączył: 20.12.2003
Skąd: Bielsko-Biała

Ostrzeżenie: (0%)
-----


Cytat
Wg wiedzy, która posiadam powiedziałbym, że Jabol bredzi (IMG:http://forum.php.pl/style_emoticons/default/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% (IMG:http://forum.php.pl/style_emoticons/default/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]
Go to the top of the page
+Quote Post
lukaswoj
post
Post #6





Grupa: Zarejestrowani
Postów: 136
Pomógł: 0
Dołączył: 2.01.2004
Skąd: Lublin

Ostrzeżenie: (0%)
-----


Oops (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Pospieszyłem się, troche, rzeczywiście.
Zwracam honor (IMG:http://forum.php.pl/style_emoticons/default/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.
Go to the top of the page
+Quote Post
FiDO
post
Post #7





Grupa: Przyjaciele php.pl
Postów: 1 717
Pomógł: 0
Dołączył: 12.06.2002
Skąd: Wolsztyn..... Studia: Zielona Góra

Ostrzeżenie: (0%)
-----


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]
Go to the top of the page
+Quote Post
Jabol
post
Post #8





Grupa: Przyjaciele php.pl
Postów: 1 467
Pomógł: 13
Dołączył: 22.02.2003

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
yoyo
post
Post #9





Grupa: Zarejestrowani
Postów: 29
Pomógł: 0
Dołączył: 20.12.2003
Skąd: Bielsko-Biała

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
cboot
post
Post #10





Grupa: Zarejestrowani
Postów: 85
Pomógł: 0
Dołączył: 2.02.2004

Ostrzeżenie: (0%)
-----


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 (IMG:http://forum.php.pl/style_emoticons/default/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 (IMG:http://forum.php.pl/style_emoticons/default/biggrin.gif)
Go to the top of the page
+Quote Post
Jabol
post
Post #11





Grupa: Przyjaciele php.pl
Postów: 1 467
Pomógł: 13
Dołączył: 22.02.2003

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 23.08.2025 - 22:31