Skocz do zawartości

Polecane posty

witam

 

mamy tabelę z atrybutami produktów

 

ID produkt ; nazwa cechy ; wartość

777 ; powierzchnia ; 1 ;

777 ; długość ; 350 ;

778 ; długość ; 350 ;

778 ; powierzchnia ; 2 ;

779 ; długość ; 350 ;

779 ; powierzchnia; 1 ;

 

 

jakim zapytaniem otrzymamy tylko produkty które np mają długość 350 ale i powierzchnię 1 ???

 

dzięki

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

jakim zapytaniem otrzymamy tylko produkty które np mają długość 350 ale i powierzchnię 1 ???

 

dzięki

SELECT idprodukt 
FROM table
WHERE idprodukt IN (SELECT idprodukt FROM table WHERE nazwa_cechy='powierzchnia' AND wartość=1 )
AND nazwa_cechy='długość' AND wartość=350;

Niezbyt ładnie ale zadziała (przynajmniej w MYSQL)

Edytowano przez nnd_newbie (zobacz historię edycji)

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

SELECT `ID produktu` FROM (SELECT `ID produktu` FROM <nazwa_tabeli> WHERE `nazwa cechy` = "długość" AND `wartość` = 350) WHERE `nazwa cechy` = "powierzchnia" AND `wartość` = 1;

 

Możesz spróbować tak ale nie jest to chyba najbardziej wydajny sposób.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Wszystkie podane rozwiązania są błędne, trzeba użyć joina na tabeli z produktami oraz tej którą pokazałaś. Ewentualnie można użyć pivota. W sumie to bez pivota się nie obejdzie.

 

Nie mam teraz na to czasu, ale może dziś postaram Ci się coś napisać, jeśli nie to dopiero w poniedziałek.

Edytowano przez Fizyda (zobacz historię edycji)

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Gość Rafiki

Wszystkie podane rozwiązania są błędne, trzeba użyć joina na tabeli z produktami oraz tej którą pokazałaś. Ewentualnie można użyć pivota. W sumie to bez pivota się nie obejdzie.

 

Nie mam teraz na to czasu, ale może dziś postaram Ci się coś napisać, jeśli nie to dopiero w poniedziałek.

 

JOIN do operacji na jednej tabeli ????

Grubo ;)

 

Autor nigdzie nic nie pisał o drugiej tabeli (np z nazwami produktów czy jakimikolwiek innymi danymi)

 

W mysql można stosować nawiasy i instrukcje typu AND i OR. Więcej tutaj: https://www.techonthenet.com/mysql/and_or.php (przykład nr. 3 pokazuje rozwiązanie Twojego problemu)

 

PS. Twój problem to podstawy mysql więc może warto przeczytać jakiś kurs :)

Edytowano przez Rafiki (zobacz historię edycji)

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

 

JOIN do operacji na jednej tabeli ????

Grubo ;)

 

Czytaj od początku do końca, a nie tylko fragmentami ;)

 

 

trzeba użyć joina na tabeli z produktami oraz tej którą pokazałaś.

 

Poza tym później dodałem że i tak bez pivota się nie obejdzie i tak, czyli tym samym join nie jest niezbędny.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Gość Rafiki

 

Czytaj od początku do końca, a nie tylko fragmentami ;)

 

 

Poza tym później dodałem że i tak bez pivota się nie obejdzie i tak, czyli tym samym join nie jest niezbędny.

 

no właśnie przeczytałem ale Ty chyba jeszcze nie....

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Dla uproszczenia nie podawałem drugiej tabeli z id produktu i nazwa produktu. Możemy przyjąć że jest tylko jedna która opisałem na początku. 2 i 3 odp chyba ok co ??

rafiki masz na myśli

 

SELECT customer_id, last_name, first_name

FROM customers

WHERE (last_name = 'Johnson')

OR (last_name = 'Anderson' AND state = 'California')

OR (last_name = 'Smith' AND status = 'Active' AND state = 'Florida');

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

 

no właśnie przeczytałem ale Ty chyba jeszcze nie....

Edytowałeś post po tym jak odpisałem ...

 

 

Autor nigdzie nic nie pisał o drugiej tabeli (np z nazwami produktów czy jakimikolwiek innymi danymi)

 

W mysql można stosować nawiasy i instrukcje typu AND i OR. Więcej tutaj: https://www.techonthenet.com/mysql/and_or.php (przykład nr. 3 pokazuje rozwiązanie Twojego problemu)

 

PS. Twój problem to podstawy mysql więc może warto przeczytać jakiś kurs :)

 

Nie napisał też o tym że takowej tabeli nie ma. Po schemacie tabeli którą pokazał gołym okiem widać że jest to tabela która wchodzi w relację jeden do wielu z tabelą z produktami i przechowywane w niej są nietypowe pola dla produktów które nie są wspólne dla wszystkich produktów w bazie.

 

Twój link i propozycja również nie rozwiązuje problemu. Raz jeszcze mówię, trzeba zastosować pivota.

 

EDIT:

Prawdopodobniej szybciej będzie zrobić to z joinem i pivotem niż samym pivotem na jednej tabeli, ponieważ w drugim przypadku będzie to trochę jazda figurowa jeśli chodzi o zapytanie.

Edytowano przez Fizyda (zobacz historię edycji)

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Gość Rafiki

@Fizyda. sora ale znowu pokazujesz ,że nie masz racji...czepiasz się już któryś raz moich wypowiedzi a pierw wypadało by abyś sam zweryfikował swoją wiedzę i porady. Jeśli masz problem do mojej osoby zapraszam na PW, a publicznie na forum radziłbym zachować merytoryczną dyskusję dot. problemów i wiedzy które traktuje wątek.

 

po pierwsze - wiadomość edytowałem dodając link z rozwiązaniem i wypowiedz PS. - nic odnośnie wypowiedzi dot. Ciebie nie zostało zmienione

po drugie - sprawdź dokładniej do czego służy JOIN i w jakim celu chcesz łączyć jedną tabele, używać JOIN'a i obciążać dodatkowo bazę?

po trzecie - cały czas chyba nie przeczytałeś postu autora tego tematu

 

a teraz dla Ciebie screen z rozwiązaniem - wynik z phpmyadmina i tabela utworzona na szybko....

zaprezentowany jest wynik zapytania ....sama tabela posiada więcej rekordów niż dwa zaprezentowane z wyniku.

 

@piotrszmigin - tak chodziło mi dokładnie o te rozwiązanie - oczywiście zamiast imion i stanów trzeba podmienić swoje wartości :)

 

post-2708-0-45693800-1495197018_thumb.png

Edytowano przez Rafiki (zobacz historię edycji)

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Dla uproszczenia nie podawałem drugiej tabeli z id produktu i nazwa produktu. Możemy przyjąć że jest tylko jedna która opisałem na początku. 2 i 3 odp chyba ok co ??

rafiki masz na myśli

 

SELECT customer_id, last_name, first_name

FROM customers

WHERE (last_name = 'Johnson')

OR (last_name = 'Anderson' AND state = 'California')

OR (last_name = 'Smith' AND status = 'Active' AND state = 'Florida');

 

Nie wiem jaką masz konfigurację serwer bazy danych, ale u mnie po krótkim teście na 10 000 rekordach działa bardzo dobrze zarówno moje rozwiązanie jak i kolegi przede mną.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

@Rafiki nie mam nic do Twojej osoby i w ogóle nie kojarzę bym czepiał się Twoich postów - czytaj jeśli tak jest/było nie robię tego umyślnie celowo.

Twoja wypowiedź była edytowana 3 razy, i nie mów że nie. Pierwsza do której się odnosiłem zawierała 2 linijki które zacytowałem (zacytowałem cały post taki jakim był w momencie gdy na niego odpowiadałem). Później dodałeś linijkę o tym że autor nigdzie nie napisał nic że jest inna tabela, a następnie link do rozwiązania.

 

Już wiem też w czym tkwi problem, chodzi dokładnie o to jak rozumiemy następujące zdanie z pierwszego postu:

 

 

jakim zapytaniem otrzymamy tylko produkty które np mają długość 350 ale i powierzchnię 1 ???

 

Ja to rozumiem że szukamy produktów które mają zadaną długość i powierzchnię. Z tego co widzę Ty to rozumiesz że szukamy produktów które mają zadaną długość lub zadaną powierzchnię, i w tym przypadku Twoje rozwiązanie jest dokładnie tym co potrzeba.

Zauważ jednak iż pozostałe osoby które zaproponowały rozwiązania używały tylko AND czyli zrozumiały problem tak jak ja, niestety ich rozwiązania są błędne i nie znajdą żadnych wyników. Cała nieścisłość powstała z winy autora, ponieważ tak opisał to czego potrzebuje, że jak teraz na to patrzę faktycznie można to podciągnąć pod OR, chociaż dla mnie nadal tam jest AND.

 

Nie rozumiem też czemu uczepiłeś się tak tego JOINa skoro sam wycofałem się z tego rozwiązania już w poście w którym go zaproponowałem, zupełnie nie rozumiem o co Ci z tym JOINem chodzi.

 

Twoje rozwiązanie jest poprawne tylko w tedy gdy chcemy uzyskać produkty które mają szukaną powierzchnię lub długość. Niestety jeśli chodzi to by znaleźć produkty które mają daną powierzchnię i długość, nie zrobisz tego jak proponujesz i musisz użyć pivota.

 

Dodatkowo ja uważam w dalszym ciągu (przynajmniej do czasu aż jasno nie napisze o co pytał) że chodzi o to by znaleźć produkty które mają podaną długość i powierzchnię, choćby z tego powodu, że wątpię by ktoś pytał o tak prostą rzecz. Nawet jeśli dopiero uczyłby się sql to to są rzeczy które musiał przerobić w jakimkolwiek kursie/tutorialu z internetu.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Nie sądzę, żeby była nieścisłość. Autor szuka produkty które mają zadaną długość ORAZ powierzchnię, inaczej nie byłoby problemu. Trudnośc polega na konstrukcji danej tabeli (wertykalnie) czego nie zauważył chyba ani @rzessski ani @Rafiki

 

1) Rozwiązanie 1 ode mnie i 2 od @davee są poprawne. Dla wyjaśnienia: zapytanie wewnętrzne wyciągnie z tabeli elementy które mają zadaną powierzchnię, a następnie spośród nich zapytanie zewnętrzne wybierze te które mają także zadaną długość.

2) Rozwiązania podane przez @rzessski i @Rafiki nie zadziałają bo są dla innej konstrukcji tabeli (takiej w której długość i powierzchnia są w jednym wierszu)

3) Join zadziała tylko po co zarzynać bazę jak można to prościej.

4) Pivot jest rozwiązaniem dedykowanym do takich właśnie zastosowań

 

Tutaj masz ładny przykład jak odwrócić bazę wertykalną do horyzontalnej przy użycia pivota: https://4programmers.net/Forum/Bazy_danych/286744-odwrocenie_bazy_wertykalnej_do_horyzontalnej?p=1345748#id1345748

Edytowano przez nnd_newbie (zobacz historię edycji)

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

1) Rozwiązanie 1 ode mnie i 2 od @davee są poprawne. Dla wyjaśnienia: zapytanie wewnętrzne wyciągnie z tabeli elementy które mają zadaną powierzchnię, a następnie spośród nich zapytanie zewnętrzne wybierze te które mają także zadaną długość.

 

Racja, szczerze mówiąc nie wpadłbym żeby to zrobić przez podzapytanie, znaczy może bym wpadł, ale to nie było rozwiązanie które pierwsze nasuwa mi się na myśl. Dlatego też tylko zerknąłem w Wasze rozwiązania, nie przeanalizowałem ich dokładniej, mój błąd.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

a czemu nie po prostu

 

select idprodukt from table where nazwa = '350' AND powierzchnia = '1';

 

Dlaczego to rozwiązanie jest błędne? Skoro jest nieprawidłowe to może ktoś w końcu podać poprawne zapytanie na pierwszy post autora :) Sam jestem ciekaw.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Dzięki za odp... na pierwszy rzut oka Newbie wygląda rozwiązanie ok. Sprawdzę i dam znać.... zbenek zapytanie jest ok ale nie zwróci tego co chcemy ;)

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Żeby zamknąć temat. W załączniku dwa skrypty.

 

tworzenie_tabeli.txt - tworzy tabelę i wypełnia losowymi danymi. Na koniec dodaje 5 produktów z których tylko dwa (idproduct 3 i 4) mają powierzchnię 1 i dlugość 350

 

zapytania.txt - trzy zapytania

1) Z zapytaniem wewnętrznym

2) Z joinem

3) Zamiana tabeli z wertykalnej na horyzontalną i wyciągnięcie danych poprzez standardowe zapytanie WHERE AND

 

Jak ktoś chce sobie przetestować wydajność to w procedurze insert_data() można zmienić zakres pętli z 200 do większej

 

PS 1. Zrobione na MySQL. W innych bazach pewnie można lepiej np. pivot w MSSQL

PS 2. Skrypty są pisane w Linuxie. Więc w Windowsie lepiej otwierać w czymś lepszym niż Notatnik. Polecam Notepad++

 

tworzenie_tabeli.txt

zapytania.txt

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Zrozumiałem. To jest dobre rozwiązanie do pierwszego postu od newbie - SELECT idprodukt

FROM table

WHERE idprodukt IN (SELECT idprodukt FROM table WHERE nazwa_cechy='powierzchnia' AND wartość=1 )

AND nazwa_cechy='długość' AND wartość=350;

? :)

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Elegancko, propsuje. Zapytania wydajne są bardzo ważne. Chcąc podnieść umiejętności w tworzeniu zapytań najlepiej trenować, trenować aż do opanowania? Mam jeszcze pytanie na marginesie. Jakie zapytania są najbardziej przydatne przy różnego rodzaju zbiorach? Pytanie może być nieco niezrozumiałe, ale mam nadzieje iż wiecie o co mi chodzi :)

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

ok a gdy dodamy jeszcze jeden parametr np kolor = red to jak wtedy taki zapytanie będzie wyglądać. mam na mysli zapytanie które pan pierwotnie napisał na górze ... dzięki

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Gość Kamikadze

Dopsiujesz do WHERE AND kolor=red według schematu.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Bądź aktywny! Zaloguj się lub utwórz konto

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto

Zarejestruj nowe konto, to proste!

Zarejestruj nowe konto

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się


×