Hirdetés

Új hozzászólás Aktív témák

  • Taci
    addikt

    N:M kapcsolatnak pont az a lényege, hogy külön-külön lekérdezhető mindegyik variációja.

    Teszemazt van egy product táblád:
    id name
    1 alma
    2 körte
    3 banán
    4 szilva
    5 narancs

    van egy categoryd:
    id name
    1 piros
    2 sárga
    3 zöld
    4 kék
    5 narancssárga

    Ezeket összerendelő product_category táblád:
    product_id category_id
    1 1
    1 2
    1 3
    2 2
    3 2
    4 4
    5 1
    5 5

    Ha erre ráuszítod az előző querymet c.name like '%sár%'-ral, akkor ki fogja neked listázni az almát, körtét, banánt, narancsot, mert azok SÁRga vagy narancsSÁRga kategóriásak.

    Ha azt akarod kérdezni, hogy melyik az a termék, amiből van sárga és piros is, akkor kétszer kell a product_category-t és a categoryt joinolni, és azokat ANDdal kérdezni:
    select p.*
    from product p
    join product_category pc1
    on pc1.product_id = p.id
    join category c1
    on c1.id = pc1.category_id
    join product_category pc2
    on pc2.product_id = p.id
    join category c2
    on c2.id = pc2.category_id
    where c1.name = 'sárga' and c2.name = 'piros'
    order by p.date desc;

    Ez már csak az almát találná meg.

    Ha ezt írnád:
    where c.name = 'sárga'
    or c.name = 'piros'
    or c.name = 'kék'

    vagy az ezzel ekvivalens
    where c.name in ('sárga','piros','kék')
    feltételt, akkor az összes sárga vagy piros vagy kék gyümölcs lejönne (alma, körte, banán, szilva)
    Narancs nem, mert itt kategórianévre teljes egyezés a feltétel!

    Megcsináltam így, működik is szépen, aktívak az indexelések is.

    Viszont így már nem tudom ugye duplikálni a rekordokat, mert a másik táblában (ahol a rekordokhoz tartozó kategóriák vannak tárolva) már nem lehet olyan könnyen.
    Szóval most egyelőre 159 rekord van.

    És amiért most írok:
    Összehasonlításként futtatom a régi lekérdezést (LIKE '%category%' stb.) és az új lekérdezést (JOIN).

    És az a régi:
    - egyrészt dupla olyan gyors (sőt, 0.0112 vs 0.0266 seconds),
    - másrészt az Explain szerint csak a szükséges 4 rekordot ellenőrzi/használja (rows: 4) az indexelés miatt (a 159 helyett).

    Hogy van ez akkor?
    A sebesség talán most még az alacsony rekord szám miatt lehet, később, sokkal több elemnél ez talán majd fordul?
    Viszont Ti is azt írtátok, és én is azt találtam, hogy ha a LIKE operátor %sztring formában van használva, akkor a teljes táblát használja.
    Itt akkor rows: 4 helyett nem rows: 159-nek kellene lennie?

    Bocsánat a sok kérdésért, de ha már így alakult, hogy saját kezüleg kell csinálnom, szeretném érteni a miérteket. És köszönöm, ha válaszoltok, tanácsot adtok.
    (És továbbra is szívesen fizetnék a segítségért, a mostani struktúra átnézéséért, módosítására javaslatért, tanácsokért stb., csak hogy biztos lehessek az erős és stabil alapban.)

    Köszönöm.

Új hozzászólás Aktív témák