Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL] Sortowanie wyników
Forum PHP.pl > Forum > Przedszkole
zman85
Witam,
mam mały problem być może tak prosty do rozwiązania, że aż głupi ale jest.
Dotyczy przesortowania wyników wyciąganych z bazy MySQL.

Mianowicie mam tabelkę z kolorami:
ID Kolor Seria Info
1 Biały Kobiety fghsdfgh
2 Beżowy Kobiety jhedjdghjdg
3 Czerwony Kobiety fghsdfgh
4 Zielony Mężczyźni jhedjdghjdg
5 Fioletowy Mężczyźni jhedjdghjdg
6 Amarant Mężczyźni fghsdfgh

gdzie serii i kolorów jest kilkaset kombinacji, nie ma szans na przypisane sztywnego koloru do zapytania
oraz tabelkę z harmonogramem:
ID KolorID SeriaID InfoID Imię Nazwisko Stanowisko itd.
1 1 1 jhedjdghjdg Ania Miś Referent ...

Potrzebuję w tym momencie wyświetlić wszystkich z wybranym kolorem, wybraną serią, posortować rosnąco przez stanowisko oraz zostawić wszystkie z pierwszym napotkanym InfoID w tabeli harmonogram.
  1. $zap="SELECT * FROM harmonogram WHERE kolor_id='Beżowy' AND seria='Kobiety' ORDER BY stanowisko ASC, pierwsze znalezione InfoID w tabeli harmonogram";



Wiem, że mógłbym przed każdym wyciągnięciem wyciągnąć dodatkowo pierwsze InfoID z tabelki kolory i wrzucić do zapytania:
  1. $zap="SELECT * FROM harmonogram WHERE kolor_id='Beżowy' AND seria='Kobiety' AND InfoID='$infoid' ORDER BY stanowisko ASC, pierwsze znalezione InfoID w tabeli harmonogram";

ale obawiam się, że już za dużo zapytań o harmonogram mam, nie chce tak obciążać bazy bo ją ubije kiedyś w końcu.
d3ut3r
Pierwsza rzecz, która rzuca się w oczy to źle zaprojektowana baza. Logiczniej byłoby tak:

kolory
Kod
ID[Primary, AutoIncrement]|kolor[unique]


serie
Kod
ID[Primary, AutoIncrement]|seria


uzytkownicy
Kod
ID[Primary, AutoIncrement]|Imie|Nazwisko|stanowisko


i dopiero wtedy harmonogram
Kod
ID[Primary, AutoIncrement]|kolor_id|seria_id|user_id


Pobranie informacji o wpisach z harmonogramu z konkretnym kolorem i serią to już tylko kwestia 1 zapytania. Nie rozumiem zupełnie za to:

Cytat
oraz zostawić wszystkie z pierwszym napotkanym InfoID w tabeli harmonogram.
zman85
Witaj,
baza jest analogicznie stworzona jak to rozpisałeś.

Może źle to napisałem, teraz powinno być prościej:
  1. $zap="SELECT * FROM harmonogram WHERE kolor_id='Beżowy - wartość pobrana z sesji' AND seria='Kobiety - wartość pobrana z sesji' AND (pierwsze napotkane InfoID z tej tabeli) ORDER BY stanowisko ASC";

Biorąc pod uwagę stworzona pokrótce na szybko bazę, było by to wszystkie rekordy z InfoID='jhedjdghjdg'.

Kolor mogę pobrać z sesji, serie również, InfoID nie mam takiej możliwości,
mógłbym pobrać przez oddzielne zapytanie do innej tabeli - nie chce tego robić.

Jestem przekonany, że jest jakaś funkcją pozwalająca wybrać 1 rekord ij ego ustawić jako filtr do sortowania wyników.
Być może JOIN by się tutaj przydał, ale również nie mam pojęcia jak ugryźć - stąd prośba o pomoc.
CuteOne
Hmm kiepsko to widzę:
a. sortujesz dane i na ich podstawie dopiero pobierasz InfoID
b. pobierasz dane przed sortowaniem, więc nie wiesz jakie będzie pierwsze InfoID

Jedyne co mi przychodzi na myśl
  1. SELECT
  2. har.*
  3. FROM
  4. harmonogram har
  5. WHERE
  6. har.InfoID = (SELECT InfoID FROM harmonogram WHERE kolor_id=har.kolor_id AND seria=har.seria ORDER BY stanowisko ASC LIMIT 1)
  7. AND
  8. kolor_id='' AND seria='' ORDER BY ORDER BY stanowisko ASC
  9.  

Pogłówkuj z tym

edit: dodałem kolor_id = har.kolor_id nie wiem czy skorelowanie zadziała w wypadku sortowania po obu stronach
zman85
Dziękuję CuteOne - udało się!


--
Można zamknąć.
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.