Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [MYSQL] Zapytanie
djbarca
post
Post #1





Grupa: Zarejestrowani
Postów: 231
Pomógł: 1
Dołączył: 22.04.2007
Skąd: Rypin

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


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 (IMG:style_emoticons/default/wink.gif)

albo bardziej obrazkowo (IMG:style_emoticons/default/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ć"

Ten post edytował djbarca 4.02.2012, 12:58:13
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 5)
viking
post
Post #2





Grupa: Zarejestrowani
Postów: 6 381
Pomógł: 1116
Dołączył: 30.08.2006

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


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.

Ten post edytował viking 4.02.2012, 14:47:24
Go to the top of the page
+Quote Post
pmir13
post
Post #3





Grupa: Zarejestrowani
Postów: 282
Pomógł: 89
Dołączył: 12.04.2011

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


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.

Ten post edytował pmir13 4.02.2012, 15:46:28
Go to the top of the page
+Quote Post
djbarca
post
Post #4





Grupa: Zarejestrowani
Postów: 231
Pomógł: 1
Dołączył: 22.04.2007
Skąd: Rypin

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


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.

Ten post edytował djbarca 5.02.2012, 12:28:21
Go to the top of the page
+Quote Post
pmir13
post
Post #5





Grupa: Zarejestrowani
Postów: 282
Pomógł: 89
Dołączył: 12.04.2011

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


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
Go to the top of the page
+Quote Post
djbarca
post
Post #6





Grupa: Zarejestrowani
Postów: 231
Pomógł: 1
Dołączył: 22.04.2007
Skąd: Rypin

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


(IMG:style_emoticons/default/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




Ten post edytował djbarca 6.02.2012, 14:38:31
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 8.10.2025 - 11:00