Mysql 3 táblából lekérdezés

Mysql 3 táblából lekérdezés
2022-11-14T11:07:16+01:00
2022-11-17T11:51:44+01:00
2022-11-17T12:42:00+01:00
deakgyuri
Sziasztok,

adott egy 3 táblás lekérdezés, jelenleg működik viszont a dátumszűrésre nincs ötletem, vagyis nem működtek az ötleteim.

Tábla 1 logok - ID - LOG TIME - DATE TIME - COMPANY ID - CONTACT ID - LOG - USER
Tábla 2 contact - ID - COMPANY ID - NÉV - TEL
Tábla 3 company - ID - NÉV - CÍM 

Szeretném csakis azokat a cégeket és embereket megtalálni, akik utolsó DATE TIME-ja 30 naponnál régebbi.

Jelenleg így néz ki a lekérdezés:

SELECT logs.logTime, logs.datetime, logs.company_id as company_id, logs.contact_id as contact_id, contact.*, companies.* FROM contact LEFT JOIN companies ON contact.company_id = companies.id LEFT JOIN logs ON contact.id = logs.contact_id WHERE ( contact.c_tel != '' OR contact.c_mobil != '' ) AND companies.c_irsz LIKE 'RO-21%' AND logs.datetime < '2022-10-15 00:00:00' ORDER BY rand() LIMIT 1
Így minden eredményt megkapok, nem csak azokat, akiknél valóban régebbi a log ideje.

Mit láttok, hogyan tudnék a dátumra megfelelően szűrni?

Köszönöm!
Mutasd a teljes hozzászólást!

  • Esetleg GROUP BY + HAVING MAX kombó?

    Valami ilyesmire gondoltam:

    SELECT contact.id, contact.name, company.id, company.name, MAX(log.datetime) FROM contact [VALAMILYEN] JOIN log ON(contact.id=log.contact_id) [VALAMILYEN] JOIN company ON(contact.company_id=company.id) WHERE ... GROUP BY 1,2,3,4 HAVING MAX(log.datetime) < ...
    A joinokhoz azért nem írtam a típust (inner/left... stb.), mert nem tudom, hogy pl. minden contacthoz tartozik-e rekord a logs táblában, illetve kötelezően van-e company_id értéke minden contact-nak... stb.
    Mutasd a teljes hozzászólást!
  • Mert left join-t használsz.
    Használj inner joint, hiszen csak azokra van szükséged, ahol ténylegesen létre is jön a join.

    Esetleg azt próbáld még meg, ha a dátumszűrést átteszed a where-ből a left join on részébe, hátha az segit.
    Vagy használj CTE-t, azt hiszem, ezt már a MySQL is tudja. Lekéred először azokat a log-okat, amik régebbiek, és azt join-olod. ugyanez, ha left join  logs helyett left join (slect * from legs where date < '2ö22-1ö-15')
    Mutasd a teljes hozzászólást!
  • Használj inner joint, hiszen csak azokra van szükséged, ahol ténylegesen létre is jön a join.

    Ez ok, de ha nincs GROUP (vagy valami DISTINCT-szerűség), akkor így (csak INNER-re átírva a JOIN-okat) pl. egy contact/company jó eséllyel többször fog szerepelni, annyiszor ahány hozzá tartozó log rekord van a megadott időpont előtt.

    Továbbá az INNER miatt kapásból kimarad majd mindenki, akinek egyáltalán nincs log-rekordja (mondjuk az ilyen esetek kezelésére az én javaslatomat is kalapálni kell még).

    CTE irányban ugyan nem gondolkodtam, de szerintem ez egyszerűen egy GROUP BY + HAVING.
    Mutasd a teljes hozzászólást!
  • Köszönöm mindenkinek a segítsége, közben elhavazódtam más feladattal.

    Holnap foglalkozom majd ezzel, eddig csak 1x zavartam össze a szervert :D
    Mutasd a teljes hozzászólást!
    Csatolt állomány
  • A lekérdezést a log táblára kellene alapozni, nem a contact táblára, mivel arra akarsz szűrni. 

    select log.*, contact.*, company.* from log left join contact... left join company...
    where log.datetime<"2000.1.1"

    Ez így érthetőbb lenne.
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd