Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [mysql][rozwiazanie]pozapytanie pobierające ostania akcje
Forum PHP.pl > Forum > Przedszkole
Hpsi
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');
thek
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
Hpsi
@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 ...
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.