Topic: patikrinti ar atrinkus irasus buvo toks keliu valandu begyje

Sveiki,

turiu galvos laužymą, ar sukti kelis selectus ir tikrinti array'ius pačiam php arba pasidaryti užklausą, kuri iš karto grąžintų tik reikiamus įrašus.
Pradinė užklausa yra

SELECT uzsakymo_nr,uzsakymo_data,pastas,uzsakymo_busena
FROM uzsakymai
WHERE mokejimas='automatinis' and
statusas!='apmoketa' and mokejimo_statusas!='OK' and 
mokejimo_data='0000-00-00 00:00:00' and
uzsakymo_statusas='naujas' and
atsauktas=0

kuri surenka tenkinančius neapmokėtus užsakymus pagal reikiamas sąlygas.
Reikia patikrinti, ar tas pats klientas nepadarė naujo užsakymo +/- 2h pirmojo bėgyje ir eliminuoti iš užklausos tokį įrašą.
How? :)

Iš anksto dėkoju,

Re: patikrinti ar atrinkus irasus buvo toks keliu valandu begyje

NA 10 peržiūrų ir nė vienas expertas nesupratot? :)
lentutė:
uzsakymo_nr | uzsakymo_data | pastas | uzsakymo_busena | data | mob_nr

kaip man pagal pirmąją užklausą dar pasitikrinti gautus rezultatus iš visos lentos, kad mob_nr sutampa ir jeigu sutampa data yra +/-2h ?
Where IN gal tiktų? žinau logiką, bet nemoku aprašyti su mysql :/

Re: patikrinti ar atrinkus irasus buvo toks keliu valandu begyje

Sveikas,

Galima viską realizuoti SQL'e. Logika tokia: reikia sujungti dvi užklausas per LEFT JOIN'ą ir į rezultatą neimti įrašų iš antros užklausos.
1 užklausa tai ta kurią tu jau turi
2 užklausa turi dar pasigaminti - ji turėtų būti paremta pirmąja ir greažinti įrašus tik tuo atveju, jeigu nėra užsąkymo +-2h

Abi užklausos sujungiamos maždaug taip:

SELECT (...)
FROM (select1)
   LEFT JOIN (select2) ON select1.key = select2.key
WHERE select2.key IS NULL

Re: patikrinti ar atrinkus irasus buvo toks keliu valandu begyje

ačiū, buvau pamiršęs panaudoti tą pačią lentutę du kartus vienoje užklausoje skirtingose aliasuose :)
Kaip turi būti antroji užklausa? Ką ji turėtų parinkti? Tik tą laiko intervalą?
ON bus s1.uzsakymo_nr=s2.uzsakymo_nr

P.S. spėju LEFT JOIN (select2) turėjo būti, taip?

Re: patikrinti ar atrinkus irasus buvo toks keliu valandu begyje

majklas wrote:

buvau pamiršęs panaudoti tą pačią lentutę du kartus vienoje užklausoje skirtingose aliasuose :)

Na aš turėjau omenyje ne tos pačios lentos panaudojimą du kartus, bet apie visiškai unikalių užklausų (query) panaudojimą.

Pvz.:

SELECT *
FROM (
   SELECT laukas1,laukas2
   FROM lenta
) AS lenta_1 LEFT JOIN (
  SELECT laukas1,laukas2
  FROM lenta
) AS lenta_2 ON lenta_1.laukas1 = lenta_2.laukas1
WHERE lenta_2.laukas1 IS NULL

Ar galima paskui supaprastinti viską ir apsieti be tokių sub-užklausų - negaliu iš anksto atsakyti, reikia žiūrėti konkrečiai į galutinę užklausą. Jeigu išeina supaprastinti tai taip ir reikėtų daryti, nes išvengus sub-užklausų padidėtų SQL užklausos vykdymo greitis.

majklas wrote:

Kaip turi būti antroji užklausa? Ką ji turėtų parinkti? Tik tą laiko intervalą?
ON bus s1.uzsakymo_nr=s2.uzsakymo_nr

Antroji užklausa turi grąžinti įrašus (iš principo užtenka tik įrašo ID), kurių klientai, norimuose laiko rėžiuose padarė po antrą užsąkymą. čia užsąkymų lentą reikia JOIN'inti pačią su savimi, kur būtų jungiama pagal tai, kad atitinka tas pats klientas ir pirmos lentos užsąkymo laikas patenka į antros lentros užsakymo laiko rėžį (+-2h), bet užsąkymo ID skiriasi. čia rašau tik teoriškai, bet +-tokia logika. Gali būti, kad širos visos užklausos sujungimui su aukščiau minėta pirma užklausa bus reikalinga daugiau duomenų (stulpelių).

majklas wrote:

P.S. spėju LEFT JOIN (select2) turėjo būti, taip?

Taip, pataisiau.