Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Problem z konstrukcją zapytania
Forum PHP.pl > Forum > Bazy danych
Manwe89
Witam. Mam tablicę w bazie i chcę z niej pobrać posortowane dane pod id malejąco więc daje:
  1. SELECT * FROM tablica ORDER BY id DESC

No a teraz dodatkow chcialbym zeby tak mi posortowalo, zeby kolo siebie znalazy sie te same adresy email (jednak glowny porzadek zachowany zostal po id malejaco). Zpaytanie:
  1. SELECT * FORM tablica ORDER BY email, id DESC

oraz
  1. SELECT * FROM tablica ORDER BY id DESC, email

nie przyniasa mi zadanego skutku, poniwaz pierwsze z nich posortuje mi wg emaili, i tylko powtarzajace sie rekoordy (w sensie z takim samym adresem email) posortuje mi po id malejaco. drugie natomiast posortuje mi po id malejaco a po emailach tylko te z tym samym id. Jednak takowych nie ma bo id jest kluczem.

Wie ktos, albo moglby rzucic zarys jak sie uporac z moim problemem??
nieraczek
Problem wynika z tego, ze id jest liczba, a email stringiem. Drugie wyrażenie jest konwertowane na typ pierwszego w ORDER BY. Mógłbyś spróbowac użyć CAST(): http://dev.mysql.com/doc/refman/5.0/en/cast-functions.html
ale wątpię żeby to rozwiązało problem, może ktoś inny zna sposób.
maly_swd
Podaj jakies dane , i jak maja byc poukladane:) bedzie latwiej (bo jakos nie doczytalem o co chodzi:) - byc moze to ze jest piatek po 17:00
Manwe89
  1. -- --------------------------------------------------------
  2.  
  3. --
  4. -- Struktura tabeli dla `pliki`
  5. --
  6.  
  7. CREATE TABLE IF NOT EXISTS `pliki` (
  8. `id` int(4) NOT NULL AUTO_INCREMENT,
  9. `imie` varchar(20) NOT NULL,
  10. `nazwisko` varchar(20) NOT NULL,
  11. `faktura` int(1) NOT NULL,
  12. `potw` int(1) NOT NULL DEFAULT '0',
  13. `email` varchar(40) NOT NULL,
  14. `hash` varchar(40) NOT NULL,
  15. `data` int(10) NOT NULL,
  16. `koszt` float NOT NULL,
  17. `kod` varchar(10) NOT NULL,
  18. `typ` int(1) NOT NULL,
  19. `akt` int(1) NOT NULL DEFAULT '0',
  20. `polecenie` int(1) NOT NULL,
  21. PRIMARY KEY (`id`)
  22. ) ENGINE=MyISAM DEFAULT CHARSET=latin2 AUTO_INCREMENT=27 ;
  23.  
  24. --
  25. -- Zrzut danych tabeli `pliki`
  26. --
  27.  
  28. INSERT INTO `pliki` (`id`, `imie`, `nazwisko`, `faktura`, `potw`, `email`, `hash`, `data`, `koszt`, `kod`, `typ`, `akt`, `polecenie`) VALUES
  29. (1, '-', '-', 0, 0, 'adres1@email.pl', '-', 1241906400, 14.93, '-', 1, 0, 0),
  30. (2, '-', '-', 0, 1, 'adres2@email.pl', '-', 1241906400, 14.93, '-', 1, 1, 0),
  31. (3, '-', '-', 0, 1, 'adres2@email.pl', '-', 1241992800, 14.93, '-', 2, 1, 0),
  32. (4, '-', '-', 0, 1, 'adres3@email.pl', '-', 1241992800, 14.93, '-', 1, 1, 0),
  33. (5, '-', '-', 0, 1, 'aders4@email.pl', '-', 1241992800, 14.93, '-', 1, 0, 0),
  34. (6, '-', '-', 0, 1, 'adres5@email.pl', '-', 1242079200, 14.93, '-', 1, 1, 0),
  35. (7, '-', '-', 0, 1, 'adres5@email.pl', '-', 1242211390, 21.47, '-', 2, 1, 0),
  36. (8, '-', '-', 0, 0, 'adres4@email.pl', '-', 1242212891, 14.93, '-', 2, 0, 0);


pola z imieniem, nazwiskiem, hashem i kodem zaminilem na : '-' z wiadomych względów smile.gif
i teraz o co chodzi. Na jeden adres email moze byc maksymalnie x (gdzie x to ilosc dostepnych typow, ale tym juz sie php zajmuje). jeden adres email wpisany w bazie nie musi znajdowac sie kolo swojego iminnika z innym typem (id: 5 i 7, adres4@email.pl). Ale na stronie chcialbym juz zeby wyniki wyswietlay sie w kolejnosci malejacej po id i dodatkowo pogrupowane mailami smile.gif tzn wynik taki chcialbym miec:

adres4
adres4
adres5
adres5
adres3
adres2
adres2
adres1
kefirek
  1. SELECT * FROM
  2. (SELECT * FROM pliki ORDER BY email DESC ) AS tabela
  3. ORDER BY id DESC
Manwe89
hmm... to jest w sumie to samo co
  1. SELECT * FROM pliki ORDER BY id DESC

bo najpierw posortujemy wg mail a potem znowu i tak po id
maly_swd
jak dobrze zrozumialem

  1. SELECT * FROM pliki ORDER BY mail, id DESC
dr_bonzo
Musialem poprawic
aders4... -> adres4 bo pewnie tak mialo byc


-- to ci pobierze emaile, kazdy raz, w kolejnosci od najnowszych
  1. SELECT DISTINCT email FROM pliki WHERE id = ( SELECT MAX( id ) FROM pliki p1 WHERE p1.email = pliki.email )
  2. ORDER BY id DESC

Przez to zlaczenie musisz zalozyc index na 'email'
ALTER TABLE `pliki` ADD INDEX ( `email` );

  1. -- to dolacza pliki do emaili (emaile sa juz posortowane)
  2. -- wiec pliki dolaczy wg emaila do kolejnych emaili
  3. SELECT DISTINCT pliki.email, p2.id FROM pliki JOIN pliki p2 ON p2.email = pliki.email
  4. WHERE pliki.id = ( SELECT MAX( id ) FROM pliki p1 WHERE p1.email = pliki.email )
  5. ORDER BY pliki.id DESC, p2.id DESC
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.