Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MySQL] Wybór kategorii zawierającej produkt, Jak w jednym zapytaniu sprawdzić, czy kategoria zawiera produkt
mikele
post 16.07.2012, 12:43:03
Post #1





Grupa: Zarejestrowani
Postów: 4
Pomógł: 0
Dołączył: 10.03.2008

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


Witam,
Są dwie tabele: kategoria i produkt (jeden do wielu)
Jak z tabeli 'kategoria' wybrać jedną kategorię zawierającą produkty - po sortowaniu alfabetycznym chcę pominąć "puste" kategorie i wybrać pierwszą, do której w tabeli 'produkt' jest przyporządkowanych więcej niż zero produktów?
Chodzi o przerobienie tego zapytania, tak by wykluczało 'puste' kategorie
  1. SELECT * FROM kategoria ORDER BY nazwa LIMIT 0,1


z góry dziękować ;]
Go to the top of the page
+Quote Post
Shido
post 16.07.2012, 14:06:14
Post #2





Grupa: Zarejestrowani
Postów: 121
Pomógł: 22
Dołączył: 22.06.2012

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


Osobistycznie nie znam się na zapytaniach z dwóch tabel, ale wiem że do czegoś takiego trzeba znać strukturę obu tabel. Więc by coś wykombinować podaj jakie tam masz kolumny w obu tabelach.


--------------------
Sorka za błędy ort. jak coś dajcie znać na PW to popoprawiam.
Go to the top of the page
+Quote Post
mikele
post 17.07.2012, 14:58:07
Post #3





Grupa: Zarejestrowani
Postów: 4
Pomógł: 0
Dołączył: 10.03.2008

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


kategoria (id, nazwa)
produkt (id, id_kategorii, nazwa)

przykładowa zawartość tabeli kategoria:
1, TV/AGD
2, Samochody
3, Elektronika
4, Artykuły spożywcze

przykładowa zawartość tabeli produkt:
1, 1, Telewizor Sony
2, 1, TV LG
3,1, DVD Sharp
4,1, Toster Panasonic
5,2, Audi
6,2, Volvo
7,3, Laptop
8,3, Palmtop
9,3, Skaner


Widać, że w produktach nie ma żadnych rekordów przypisanych do kategorii 'Artykuły spożywcze'
Jak skonstruować zapytanie aby z tabeli 'kategoria' wskazać po sortowaniu alfabetycznym pierwszy rekord, który ma przyporządkowane produkty w drugiej tabeli?
Co trzeba dodać do poniższego? INNER JOIN?
  1. SELECT * FROM kategorie ORDER BY nazwa LIMIT 0,1


powyższe zapytanie zwróci 'Artykuły spożywcze' a chciałbym aby zwróciło 'Elektronika'
Go to the top of the page
+Quote Post
Damonsson
post 17.07.2012, 15:19:04
Post #4





Grupa: Zarejestrowani
Postów: 2 355
Pomógł: 533
Dołączył: 15.01.2010
Skąd: Bydgoszcz

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


  1. SELECT DISTINCT k.nazwa FROM produkt p
  2. LEFT JOIN kategoria k ON k.id=p.id_kategorii
  3. ORDER BY k.nazwa ASC


Powinno działać

edit: w sumie, pewnie można to zrobić lepiej i wydajniej, ale ja się na tym nie znam ;P

Ten post edytował Damonsson 17.07.2012, 15:24:27
Go to the top of the page
+Quote Post
thek
post 17.07.2012, 16:08:23
Post #5





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




To ja podam Ci łopatologiczne opisy złączeń... W nawiasach są słowa opcjonalne, które mogą, ale nie muszą wystąpić.

NATURAL JOIN - zwraca rekordy łącząc w obu tabelach rekordy po kolumnie o tej samej nazwie
(INNER) JOIN - zwraca rekordy pasujące do warunku złączenia w obu tabelach
LEFT (OUTER) JOIN - zwraca wszystkie rekordy tabeli po lewej stronie, nawet jeśli żaden po prawej nie pasuje
RIGHT (OUTER) JOIN - zwraca wszystkie rekordy tabeli po prawej stronie, nawet jeśli żaden po lewej nie pasuje
FULL (OUTER) JOIN - zwraca wszystkie rekordy obu tabel, nawet jeśli nie pasuje do nich żaden z przeciwnej tabeli
CROSS JOIN - zwraca iloczyn kartezjański wszystkich rekordów w obu tabelach

Popatrz i zauważ, który tu pasuje smile.gif


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
Go to the top of the page
+Quote Post
Damonsson
post 17.07.2012, 16:23:30
Post #6





Grupa: Zarejestrowani
Postów: 2 355
Pomógł: 533
Dołączył: 15.01.2010
Skąd: Bydgoszcz

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


Czyli w takim wypadku lepiej użyć INNER? Wydajniej, szybciej? Bo LEFT też zadziała.
Go to the top of the page
+Quote Post
thek
post 17.07.2012, 20:30:34
Post #7





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




Oba zadziałają, ale przy LEFT musiałbyś eliminować rekordy gdzie kategoria ma NULLA (lewa tabela to kategorie) lub przedmiot nie jest jeszcze w żadnej kategorii jeszcze bądź mu ją usunięto (lewa tabela to przedmioty).


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
Go to the top of the page
+Quote Post
Rysh
post 17.07.2012, 20:36:50
Post #8





Grupa: Zarejestrowani
Postów: 821
Pomógł: 111
Dołączył: 11.09.2006
Skąd: Biała Podlaska

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


Cytat(thek @ 17.07.2012, 17:08:23 ) *
To ja podam Ci łopatologiczne opisy złączeń... W nawiasach są słowa opcjonalne, które mogą, ale nie muszą wystąpić.

Dzięki thek i mi się przyda, często miałem z tym problem smile.gif


--------------------
Go to the top of the page
+Quote Post
thek
post 18.07.2012, 00:47:27
Post #9





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




Uważaj na NATURAL JOIN i tabele posiadające kilka kolumn z tymi samymi nazwami, bo co baza to inaczej może to mieć rozwiązane smile.gif Lepiej używać JOIN ... USING ... ale tu z kolei jest zonk, bo tej składni choćby MSSQL nie wspiera z tego co kojarzę.


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
Go to the top of the page
+Quote Post

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

 



RSS Wersja Lo-Fi Aktualny czas: 19.07.2025 - 09:19