Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL] Wybór kategorii zawierającej produkt
Forum PHP.pl > Forum > Przedszkole
mikele
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ć ;]
Shido
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.
mikele
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'
Damonsson
  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
thek
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
Damonsson
Czyli w takim wypadku lepiej użyć INNER? Wydajniej, szybciej? Bo LEFT też zadziała.
thek
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).
Rysh
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
thek
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ę.
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.