Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [mysql][rozwiazanie]pozapytanie pobierające ostania akcje
Hpsi
post 3.06.2011, 08:50:32
Post #1





Grupa: Zarejestrowani
Postów: 483
Pomógł: 50
Dołączył: 15.03.2005
Skąd: Poznań

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


Witam, z góry przepraszam jeśli mylący jest troszkę temat ale za chiny nie mogłem znaleźć tytułu do mojego problemu wink.gif
Co do problemu zdaje mi się ze chyba gdzieś zabłądziłem myślami i dlatego muszę Was poprosić o pomoc smile.gif
Opis problemu:
Mam sobie 3 tabelki
// serwer z którego pobieram nazwę
// domena która z której pobieram wszystkie informacje
// akcje z której chcę pobrać datę ostatniej akcji
Skrócona wersja tabeli akcje (Bo chce tylko wyciągnąć date)
  1. CREATE TABLE `akcje`
  2. (
  3. `id` int(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,
  4. `data` date NOT NULL,
  5. `domena_id` int(10) NOT NULL
  6. );


Problem wydaje się banalny jeśli bym chciał wykonać najpierw zapytanie domena->serwer i dodatkowo np w while dodac date ostaniej akcji, no ale jeśli brać pod uwagę, że może być to np 50 domen z których pobieram dane, to mogło by być troszkę nieoptymane.

aktualnie moje zapytanie do sql wygląda tak
  1. $this->engine->db->query('
  2.  
  3. SELECT
  4. `d`.*, `serwer`.`nazwa` AS `serwer_nazwa`,
  5. IF(`d`.`data_in`<"'.date('Y-m-d', time()-(60*60*24*7)).'", 1, 0) AS `bold` ,
  6. IF(`d`.`data_in`<"'.date('Y-m-d', time()-(60*60*24*15)).'", 1, 0) AS `error`
  7. FROM
  8. |domeny| AS `d`
  9. LEFT JOIN
  10. |serwer| AS `serwer`
  11. ON
  12. `d`.`serwer`=`serwer`.`id`
  13. ORDER BY `d`.`id` ASC');

i w tym momencie się zawiesiłem , jak pobrać dodaktowo jeszcze datę ostaniej akcji z tabeli akcje w tym zapytaniu

A i dodatkowo w instrukcjach warunkowych w zapytaniu muszę zamienić `d`.`data_in` własnie na tą datę którą pobiorę z akcji...

----
Edit:
Tak jak myślałem sposób rozwiazania mojego problemu był banalny, wystarczyła kawa + papieros i zaraz umysł się rozjaśnił:
  1. $this->engine->db->parse('
  2.  
  3. SELECT
  4. `d`.*, `serwer`.`nazwa` AS `serwer_nazwa`,
  5. IF(`a`.`data`<"'.date('Y-m-d', time()-(60*60*24*7)).'", 1, 0) AS `bold` ,
  6. IF(`a`.`data`<"'.date('Y-m-d', time()-(60*60*24*15)).'", 1, 0) AS `error`
  7. FROM
  8. |domeny| AS `d`
  9. LEFT JOIN
  10. |serwer| AS `serwer`
  11. ON
  12. `d`.`serwer`=`serwer`.`id`
  13. LEFT JOIN
  14. |links| AS `a`
  15. ON
  16. `d`.`id`=`a`.`do`
  17. GROUP BY `d`.`id`
  18. ORDER BY `d`.`id` ASC, `a`.`data` DESC');


Ten post edytował Hpsi+ 3.06.2011, 09:32:07


--------------------
Daiquiri: T1 = (dx/dt * s)^hpsi
Daiquiri: gdzie T1 - Twój czas przybycia na miejsce, dx/dt - prędkość, s droga
Daiquiri: brb trzeba by to poprawić T1 - Czas jaki Ci to zajmie
Daiquiri: Zatem T - czas dotarcia p T1 + T2 gdzie T2 = aktualny czas

===
po prostu kocham ją :D haha
Go to the top of the page
+Quote Post
thek
post 3.06.2011, 09:14:04
Post #2





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




A po co robić datę? wink.gif Zauważ jedną prostą zależność.... Akcja o późniejszej dacie ma jednocześnie wyższy ID... Co nam to daje? Wychodzimy od tabeli akcje jako bazowej i łaczymy z wybranymi innymi tabelami, czyli domena oraz serwer po właściwych kluczach oraz... wybieramy ograniczenia czyli albo domenę albo serwer czy co tam chcesz, sortujemy po ID malejąco i birzemy tyle rekordów w LIMIT ile Ci pasuje smile.gif


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
Go to the top of the page
+Quote Post
Hpsi
post 3.06.2011, 09:16:49
Post #3





Grupa: Zarejestrowani
Postów: 483
Pomógł: 50
Dołączył: 15.03.2005
Skąd: Poznań

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


@thek własnie gdyby była ta zależność nie musiał bym myśleć nad tym zbytnio , problem polegał na tym iż akcje mogły być wprowadzone z datą wstecz ... i dlatego właśnie musiałem pokombinować, znów zrobić na zasadzie updata tabeli w czasie dodawania akcji - szczerze wolałem to rozwiązać dając JOIN niż się bawić w warunki sprawdzające, tylko z drugiej strony pytanie brzmi ile stracę poprzez własnie tego typu zapytanie (Chodzi o czas generowania zapytania np przy 100 domenach)

--
Jednak zapytanie skonociłem, wyświela mi się w liście domen, każda z domen tyle razy ile akcji jest wprowadzona...
Eh jednak człowiek zawsze o czymś zapomni i po napisaniu postu przypomni sobie - sorry za zaśmiecanie troszkę, zapomniałem dodać GROUP ...

Ten post edytował Hpsi+ 3.06.2011, 09:31:15


--------------------
Daiquiri: T1 = (dx/dt * s)^hpsi
Daiquiri: gdzie T1 - Twój czas przybycia na miejsce, dx/dt - prędkość, s droga
Daiquiri: brb trzeba by to poprawić T1 - Czas jaki Ci to zajmie
Daiquiri: Zatem T - czas dotarcia p T1 + T2 gdzie T2 = aktualny czas

===
po prostu kocham ją :D haha
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 19.07.2025 - 03:11