Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Problem z konstrukcją zapytania
Manwe89
post
Post #1





Grupa: Zarejestrowani
Postów: 81
Pomógł: 3
Dołączył: 28.10.2008
Skąd: Łuków

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


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??

Ten post edytował Manwe89 22.05.2009, 12:03:23
Go to the top of the page
+Quote Post
nieraczek
post
Post #2





Grupa: Zarejestrowani
Postów: 405
Pomógł: 6
Dołączył: 12.01.2007

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


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.
Go to the top of the page
+Quote Post
maly_swd
post
Post #3





Grupa: Zarejestrowani
Postów: 744
Pomógł: 118
Dołączył: 14.02.2009
Skąd: poziome

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


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





Grupa: Zarejestrowani
Postów: 81
Pomógł: 3
Dołączył: 28.10.2008
Skąd: Łuków

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


  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 (IMG:http://forum.php.pl/style_emoticons/default/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 (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) tzn wynik taki chcialbym miec:

adres4
adres4
adres5
adres5
adres3
adres2
adres2
adres1
Go to the top of the page
+Quote Post
kefirek
post
Post #5





Grupa: Zarejestrowani
Postów: 781
Pomógł: 256
Dołączył: 29.06.2008

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


  1. SELECT * FROM
  2. (SELECT * FROM pliki ORDER BY email DESC ) AS tabela
  3. ORDER BY id DESC
Go to the top of the page
+Quote Post
Manwe89
post
Post #6





Grupa: Zarejestrowani
Postów: 81
Pomógł: 3
Dołączył: 28.10.2008
Skąd: Łuków

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


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





Grupa: Zarejestrowani
Postów: 744
Pomógł: 118
Dołączył: 14.02.2009
Skąd: poziome

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


jak dobrze zrozumialem

  1. SELECT * FROM pliki ORDER BY mail, id DESC


Ten post edytował maly_swd 25.05.2009, 09:27:37
Go to the top of the page
+Quote Post
dr_bonzo
post
Post #8





Grupa: Przyjaciele php.pl
Postów: 5 724
Pomógł: 259
Dołączył: 13.04.2004
Skąd: N/A

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


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
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: 15.10.2025 - 05:12