Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [mysql][php] sortowanie
Forum PHP.pl > Forum > PHP
Dynuel
Problem jest taki, mam taką tabelę:
  1. id, kategoria, DATA, godzina, jezyk, tytul, link
  2. 1, 27, 2007-11-02, 21:34:57, 1, Tytuł..., www....

i teraz chciałbym zrobić możliwość łączenia różnych wpisów, jako duplikaty, tak by były one w jednej grupie podczas listowania całej tabeli, np:
  • ...
  • wpis
    • powiązany wpis
    • powiązany wpis
    • powiązany wpis
  • jakiś wpis
  • jakiś wpis
  • jakiś wpis
  • ...
najlepszym a właściwie jedynym sposobem (na który wpadłem) jest wprowadzenie nowego pola 'duplikat'
  1. id, DUPLIKAT, kategoria, DATA, godzina, jezyk, tytul, link

które normalnie będzie puste (jeżeli takowych duplikatów nie będzie) a jeżeli będą to w dane pole (we wszystkich rekordach) zostanie wpisany ten sam unikalny klusz ( int )

to jeszcze jest ok, tylko problem pojawia się gdy bym chciał taką tablicę wylistować (sortując według daty i godziny)

np są takie wpisy:

  1. id, duplikat, kategoria, DATA, godzina, jezyk, tytul, link
  2. 1, 0, 27, 2007-11-02, 11:00:00, 1, coś tam, www...
  3. 2, 1, 27, 2007-11-02, 12:00:00, 1, wydarzenie1, www...
  4. 3, 0, 27, 2007-11-02, 13:00:00, 1, cos tam, www...
  5. 5, 1, 27, 2007-11-02, 15:00:00, 1, wydarzenie1, www...
  6. 6, 0, 27, 2007-11-02, 16:00:00, 1, cos tam, www...
  7. 7, 1, 27, 2007-11-02, 17:00:00, 1, wydarzenie1, www...
  8. 9, 0, 27, 2007-11-02, 19:00:00, 1, cos tam, www...

tutaj od razu odwrócę kolejność (sortując po DACIE i GODZINIE) by było łatwiejsze porównanie

  1. id, duplikat, kategoria, DATA, godzina, jezyk, tytul, link
  2. 9, 0, 27, 2007-11-02, 19:00:00, 1, cos tam, www...
  3. 7, 1, 27, 2007-11-02, 17:00:00, 1, wydarzenie1, www...
  4. 6, 0, 27, 2007-11-02, 16:00:00, 1, cos tam, www...
  5. 5, 1, 27, 2007-11-02, 15:00:00, 1, wydarzenie1, www...
  6. 3, 0, 27, 2007-11-02, 13:00:00, 1, cos tam, www...
  7. 2, 1, 27, 2007-11-02, 12:00:00, 1, wydarzenie1, www...
  8. 1, 0, 27, 2007-11-02, 11:00:00, 1, coś tam, www...

tak aby duplikaty były połaczone w jedną grupę oraz aby była ona wyświetlona na miejscu PIERWSZEGO elementu

z grupy (tak że niby dodaje nowy wpis, od razu zaznaczając do jakiej grupy ma należeć, a cała grupa pójdziedo góry i zostanie wyświetlona pod najnowszym wpisem z tej grupy)

  1. id, duplikat, kategoria, DATA, godzina, jezyk, tytul, link
  2. 9, 0, 27, 2007-11-02, 19:00:00, 1, cos tam, www...
  3. 7, 1, 27, 2007-11-02, 17:00:00, 1, wydarzenie1, www...
  4. 5, 1, 27, 2007-11-02, 15:00:00, 1, wydarzenie1, www...
  5. 2, 1, 27, 2007-11-02, 12:00:00, 1, wydarzenie1, www...
  6. 6, 0, 27, 2007-11-02, 16:00:00, 1, cos tam, www...
  7. 3, 0, 27, 2007-11-02, 13:00:00, 1, cos tam, www...
  8. 1, 0, 27, 2007-11-02, 11:00:00, 1, coś tam, www...

oraz myśle że dużo trudniejsza opcja tak aby grupa była wyświetlona na miejscu OSTATNIEGO elementu z grupy (tak że nieby dodaje nowy wpis, od razu zaznaczając do jakiej grupy ma należeć, i ona (oraz reszta elementów z grupy) zostaje wyświetlona pod pierwszym elementem z grupy, ze całość zostaje na miejsc najwcześniejszego wpisu)

  1. id, duplikat, kategoria, DATA, godzina, jezyk, tytul, link
  2. 9, 0, 27, 2007-11-02, 19:00:00, 1, cos tam, www...
  3. 6, 0, 27, 2007-11-02, 16:00:00, 1, cos tam, www...
  4. 3, 0, 27, 2007-11-02, 13:00:00, 1, cos tam, www...
  5. 2, 1, 27, 2007-11-02, 12:00:00, 1, wydarzenie1, www...
  6. 5, 1, 27, 2007-11-02, 15:00:00, 1, wydarzenie1, www...
  7. 7, 1, 27, 2007-11-02, 17:00:00, 1, wydarzenie1, www...
  8. 1, 0, 27, 2007-11-02, 11:00:00, 1, coś tam, www...

Mam nadzieję że ktokolwiek mnie choć troche zrozumiał, nie prosze o gotowe rozwiązanie, jedynie pomoc i nakierowanie mnie, gdyż obecnie nie mam pojęcia jak to zrobić.

myślałem o jakimś użyciu DISTINCT duplikat, lub jakim kolwiek sposobie by z rekordów usunąć duplikaty (zostawić tylko jeden pierwszy bądź ostatni) i gdy w wynikach na niego na potkam, to wtedy wczytać reszte, aczkolwiek distinct niestety nie działa w ten sposób..
Indeo
Przyznam, że nic z tego nie rozumiem. Oglądając listingi pomyślałem, że chodzi Ci o możliwość sortowania tabeli tak, aby powiązane rekordy trzymały się razem.
  1. SELECT id,duplikat,
  2. case
  3. when duplikat=0 then id
  4. when duplikat>0 then duplikat
  5. end AS filtr
  6. FROM tabela ORDER BY filtr,duplikat


Aby np wyróżnić główne rekordy od potomnych można utworzyć pole sterujące stylem css na zasadzie:
  1. SELECT id,duplikat,
  2. case
  3. when duplikat=0 then id
  4. when duplikat>0 then duplikat
  5. end AS filtr,
  6. case
  7. when duplikat=0 then 'czerwony'
  8. when duplikat>0 then 'niebieski'
  9. end AS kolor
  10. FROM tabela ORDER BY filtr,duplikat
Dynuel
Cytat
Przyznam, że nic z tego nie rozumiem.
ok, tak szczerze to przyznam ze właśnie tego się spodziewałem.

Jeszcze raz: chcę zrobić sortowanie, a właściwie to dwa rodzaje tego sortowania:

grupa - grupa wpisów które mają taką samą wartość w polu DUPLIKAT, te które nie należą do żadnej grupy mają wartość 0

1. wylistować wszystko tak by właśnie duplikaty trzymały się razem w jednej grupie (jeden pod drugim), tylko nie chce sortować według nich by najpierw była jedna grupa duplikatów , potem nastepna , nastepna a na końcu te nie należące do żadnej grupy, lecz tak by grupa była wyświetlona na miejscu (pozycji pomiędzy innymi wpisami) ostatniego (najnowszego) duplikatu (elementu z grupy),

2. to samo co wyżej tylko ze grupa wyświetlana jest na miejscu pierwszego (najstarszego) elementu z grupy (duplikatu)


właściwie znalazłem 'jakieś' rozwiązanie tego problemu, niestety w php gdyż na sql'u sie aż tak nie znam, metoda jest taka:

1. sprawdza czy wpis jest duplikatem ( duplikat != 0 ) jeżeli nie to nic z nim nie robi i go normalnie wyświetla a jeżeli tak to:
(i teraz w zależności od tego czy chcę by cała grupa duplikatów była wyświetlana na miejscu PIERWSZEGO bądź OSTATNIEGO rekordu z tej grupy)
2. sprawdzam zapytaniem mysql czy to jest PIERWSZY/OSTATNI wpis/duplikat z grupy, jeżeli nie to zostanie on pomijany, jeżeli tak to zostaje on wyświetlony oraz:
3. zostają doczytane pozostałe elementy z taką samą wartością w polu DUPLIKAT, oraz wyświetla je z prametrem CSS robiącym wcięcie czy jakkolwiek zaznaczającym ze są to kopie powyższego wpisu


w sumie, zostaje wysłane jedno główne zapytanie + jedno zapytanie dla każdego duplikatu (sprawdzające czy jest pierwszym/ostatnim elementem z grupy) + jedno zapytanie wyświetlające całą grupę (gdy już znajdziemy ten pierwszy/ostatni element), więc powiedzmy że na 40 rekordów (jedną stronę) gdzie może być tak z 10-20 duplikatów, wysyłane jest tak na oko 13-23 zapytania, nie ma co najefektywniejsze to to nie jest

wersję rozwiązaną całkowicie w mysqlu wolał bym też ponieważ wygodniejsze by było podczas robienie stronicowania


EDIT:
myślałem troche nad tym zapytaniem i powiem że gdybym tylko znał sql troche bardziej to dało by rade to zrobić

mam taki kod:
  1. SELECT id, duplikat, title, date,
  2.  
  3. CASE
  4. WHEN duplikat = 0 THEN date
  5. WHEN duplikat > 0 THEN (SELECT max(date) FROM materialy WHERE materialy.duplikat = duplikat)
  6. END AS filtr_data
  7.  
  8. FROM materialy ORDER BY filtr_data DESC

wiem że to powyżej nie zadziała, ale gdyby mi sie tylko udało wstawić zamiast (SELECT max(date) FROM materialy WHERE materialy.duplikat = duplikat) maksymalną datę z grupy wpisów gdzie pole DUPLIKAT równe jest polu DUPLIKAT aktualnie przetwarzanego wpisu ( WHEN duplikat > 0 THEN ... )
wtedy wszystkie duplikaty miały by taką samą datę i można by je ładnie posortować z resztą rekoródw, a one były by wszystkie obok siebie
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.