Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MYSQL] Zapytanie
Forum PHP.pl > Forum > Bazy danych > MySQL
djbarca
witam. potrzebuje waszej pomocy. mam 2 tabele przykladowo

TabelaA
id
marka_auta


TabelaB
id
id_tabeliA
model_auta
dostępność

przykladowo. wrzucam

do tabeliA

1, opel
2, VW

do tabeliB

1, 1, corsa, dostępny
2, 1, insignia, zajęty

i teraz chce zliczyć wszystkie marki aut(tabela A) pod warunkiem ze z (tabeliB) wszystkie modele tego auta są dostępne czyli jeśli mam markę opel. w niej np 2 dostępne modele to jeśli wszystkie są dostępne to zliczenie kategorii opla traktowane jest jako 1. a jeśli jakiś model tego auta niedostępny wtedy cala marka jest 0(do sumowania). trochę to bez sensu ale tak będzie prościej to przedstawić chyba wink.gif

albo bardziej obrazkowo wink.gif "Mamy halę w której znajdują się skrzynie z jabłkami na sprzedaż . Jeśli chociaż jedno jabłko w danej skrzyni jest zepsute to cała skrzynia jest do wyrzucenia. Policz ilość skrzyń które uda się sprzedać"
viking
Jakoś tak:
  1. SELECT DISTINCT ON(marka_auta) *
  2. FROM (SELECT
  3. CASE WHEN a.dostepnosc > '0' THEN 'jest'
  4. else 'brak'
  5. end test, m.marka_auta
  6. FROM dane.marki m LEFT JOIN dane.auta a ON m.id=a.id_marki GROUP BY test, m.marka_auta) s


Składnia postgresql, nie pamiętam czy case się tak pisało w mysql.
pmir13
W ogóle nie trzeba łączyć A, wszystko co trzeba mamy w B, przecież wystarczy policzyć różne id_tabeliA z B zamiast liczyć coś z A.

  1. SELECT COUNT(id_tabeliA) FROM tabelaB
  2. GROUP BY id_tabeliA
  3. HAVING MAX(dostepnosc) = 'dostepny'

Przy indeksie na id_tabeliA będzie śmigać nawet na dużej bazie.
djbarca
pmir13 Twój sposób może i jest dobry ale w ten sposób nie mogę tego zrobić. Moze postaram sie przedstawić to tak jak wygląda w rzeczywistości:


  1. CREATE TABLE IF NOT EXISTS `-klany_spotkania` (
  2. `id` int(11) NOT NULL AUTO_INCREMENT,
  3. `gosp` int(11) NOT NULL, //id klanu - gospodarza
  4. `gosc` int(11) NOT NULL, //id klanu - goscia
  5. `kolejka` int(11) NOT NULL,
  6. PRIMARY KEY (`id`)
  7. ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ;
  8.  


  1. CREATE TABLE IF NOT EXISTS `-klany_mecze` (
  2. `id` int(11) NOT NULL AUTO_INCREMENT,
  3. `id_spotkania` int(11) NOT NULL,
  4. `gosp` int(11) NOT NULL, //id uzytkownika - gospodarza
  5. `gosc` int(11) NOT NULL, //id uzytkownika - goscia
  6. `w1` int(11) NOT NULL,
  7. `w2` int(11) NOT NULL,
  8. `status` int(11) NOT NULL,
  9. PRIMARY KEY (`id`)
  10. ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ;



Spotkanie klanowe , to łącznie 4 mecze miedzy użytkownikami danego klanu.
Teraz, mając dostępny identyfikator klanu , który może wystąpić w tabeli `-klany_spotkania` w polu 'gosp' albo 'gość' (zakładając , ze spotkanie jest zakończone tylko wtedy , gdy wszystkie 4 mecze w danym spotkaniu maja status = 3) policzyć ile spotkań ukończył dany klan.
pmir13
Trochę za bardzo uprościłeś przykład.
Ale teraz też dość podobnie można to policzyć, spróbuj tak:

  1. SELECT COUNT(*) AS ukonczonych_spotkan FROM
  2. (
  3. SELECT id_spotkania, COUNT(*) AS ukonczonych_meczy
  4. FROM `-klany_mecze`
  5. WHERE gosc = 1 OR gosp = 1
  6. GROUP BY id_spotkania
  7. HAVING MIN(STATUS)=3
  8. ) s
  9. WHERE s.ukonczonych_meczy = 4


W zależności od tego co oznaczają statusy, ile ich jest i czy może być NULL będziesz musiał zmienić linię z HAVING, na przykład jeśli możliwy jest też status=4 albo wyższy to zamiast tego byłoby:
  1. HAVING MIN(STATUS)=3 AND MAX(STATUS)=3
djbarca
smile.gif już bliżej ale wciąż nie to.



mam dostępny identyfikator klanu a tutaj sprawdzasz w tabeli `-klany_mecze` w polach z identyfikatorami graczy danego klanu. w jaki sposób to zmienić tak żeby było sprawdzane nie w tabeli `-klany_mecze` a `-klany_spotkania`
  1. WHERE gosc = 1 OR gosp = 1


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.