![]() |
![]() ![]() |
![]() |
![]()
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ć... |
|
|
![]()
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]
|
|
|
![]()
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łobyKod 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... :/ |
|
|
![]()
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) |
|
|
![]()
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] |
|
|
![]()
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. |
|
|
![]()
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] |
|
|
![]()
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. |
|
|
![]()
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
|
|
|
![]()
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) |
|
|
![]()
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.
|
|
|
![]() ![]() |
![]() |
Aktualny czas: 23.08.2025 - 22:31 |