Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL] Jak zbudować zapytanie SELECT?
Forum PHP.pl > Forum > Przedszkole
cent4
Witam.
Mam pewien problem i nie wiem jak zbudować dosyć skomplikowane zapytanie do bazy:
Są 2 tabele z polami:
TABELE: | POLA:
media | Med, Kat, Nr_id, Autor, Tyt
egzempl | Med, Kat, Nr_id, Data

Problem:
W tabeli media są książki (autor, tytuł i inne takie dane), a w tabeli egzempl są dodatkowe dane książek, gdzie książka odpowiada danemu numerowi - połączone Med+Kat+Nr_id.
Trzeba dostać w wyniku zapytania dane z tabeli media z sumą pewnych wartości z tabeli egzempl:

Med, Kat, Nr_id, Autor, Tyt z tabeli media + ilość tych książek, która ma być wyliczona w taki sposób, że: ma zsumować ilość rekordów z tabeli egzempl, gdzie Med, Kat, Nr_id z tabeli egzempl jest równe Med, Kat, Nr_id z tabeli media.

Zapytanie jest za skomplikowane jak dla mnie co_jest.gif
karolo_k
Z tego co zrozumiałem to chcesz policzyć rekordy w tabeli ?
cent4
Wypisać dane z tabeli media: Med, Kat, Nr_id, Autor + ilość tych książek, która ma być wyliczona w taki sposób, że: ma zsumować ilość rekordy z tabeli egzempl, gdzie Med, Kat, Nr_id z tabeli egzempl jest równe Med, Kat, Nr_id z tabeli media.
Valdi_B
Wariant 1: Liczba egzemplarzy poszczególnych książek.
Do tego wystarczy sama tabela egzempl:
  1. SELECT Med, Kat, Nr_id, count(*) AS Liczba
  2. FROM egzempl
  3. GROUP BY Med, Kat, Nr_id;
Wariant 2:
Jeżeli do tego chcesz jeszcze atrybuty książek (z tabeli media, np. autor i tytuł), to trzeba zrobić łączenie z tabelą media:
  1. SELECT e.Med, e.Kat, e.Nr_id, count(*) AS Liczba, m.Autor, m.Tyt
  2. FROM egzepl AS e NATURAL JOIN media AS m
  3. GROUP BY Med, Kat, Nr_id;
Wada:
Komputer "niepotrzebnie się napracuje", bo:
- do każdego rekordu z egzepl "dociągasz" dane z media,
- dopiero potem grupujesz,
więc dane do tego samego rekordu wynikowego są "dociągane" wielokrotnie (do każdego rekordu egzemplarza, z których potem powstanie 1 rekord wynikowy).

Wariant 3: Bardziej inteligentny:
  1. SELECT * FROM
  2. (SELECT Med, Kat, Nr_id, count(*) AS Liczba FROM egzempl
  3. GROUP BY Med, Kat, Nr_id) AS e
  4. NATURAL JOIN media AS m;
Co teraz jest lepiej:
Najpierw powstaje "zgrupowana" tabela - wynik wariantu 1 - to co w nawiasach.
Dopiero potem, do każdego rekordu (za daną książkę, powstałego ze "zgrupowania" wszystkich egzemplarzy) są jeden raz dociągane dane z tabeli media.
Frazy "AS e" i "AS m" są niby zbędne, ale mogą się przydać w razie umieszczenia po SELECT nie "*", ale konkretnych kolumn.
NATURAL JOIN - to "skrót" w stosunku do "zwykłego" JOIN'a - łączenie po wszystkich kolumnach o takich samych nazwach.
cent4
Valdi_B jesteś genialny - działa wszystko, że hej.
Dziękuję
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.