Aktív témák
-
Taybore
aktív tag
SELECT u.nick, u.email, t.cim, count(k.komment_id) AS darab
FROM tema t JOIN megosztas m ON m.tema_id = t.tema_id
JOIN user u ON m.user_id = u.user_id
LEFT JOIN temalatogatas l ON l.user_id = m.user_id AND l.tema_id = m.tema_id
LEFT JOIN komment k ON k.tema_id = m.tema_id AND IFNULL(l.datum,0) < k.datum
WHERE t.allapot = '1'
AND u.allapot = '1'
AND u.ertesitest_ker = '1'
GROUP BY u.nick, u.email, t.cim
ORDER BY 1,3Így gondoltad? Ez így akkor elvileg hatékonyabb, vagy legalábbis nem bízza a véletlenre a hatékonyságot?
-
Taybore
aktív tag
Ez így hatékonyabb megoldás? Mert vannak még további WHERE-ek, csak az egyszerűség kedvéért nem írtam ide. (Pl: ... AND u.allapot = 1 AND u.ertesitest_ker = 1 AND t.allapot = 1, stb...) Ezek nem táblakapcsolathoz tartozó feltételek, hanem az egész SELECT-et szűkítik. Ezeket nem lehet az ON-ba betenni, nem?

-
Taybore
aktív tag
Nem tudom. Most tanulom a JOIN-t, eddig nem nagyon használtam. Miért, te hogy oldanád meg szépen?
-
Taybore
aktív tag
Asszem sikerült

SELECT u.nick, t.cim, count(k.komment_id) AS darab
FROM (tema t, user u, megosztas m)
LEFT JOIN temalatogatas l ON l.user_id = m.user_id AND l.tema_id = m.tema_id
LEFT JOIN komment k ON k.tema_id = m.tema_id AND IFNULL(l.datum,0) < k.datum
WHERE m.user_id = u.user_id
AND m.tema_id = t.tema_id
GROUP BY u.nick, t.cimEz ránézésre azt adja ki, amit elvártam tőle.
Köszönöm a rávezetést!
Ami még kellett hozzá, az, hogy zárójellel 3 tábla kapcsolatához JOIN.-oltam (ezt nem tudtam), a másik az IFNULL (NVL@ORA) használata a látogatatlan témák megszámolásához.
Most épp örülök
-
Taybore
aktív tag
Így már kiírja szépen mindegyik témát, mellé mindegyik felhasználót (n*m rekordba), de a count mindenhova 1 egy ad értéknek.
SELECT t.cim, u.nick, count(1)
FROM megosztas m LEFT JOIN temalatogatas l ON m.tema_id = l.tema_id AND m.user_id = l.user_id
LEFT JOIN user u ON u.user_id = m.user_id
LEFT JOIN tema t ON t.tema_id = m.tema_id
LEFT JOIN komment k ON k.user_id = l.user_id AND k.tema_id = l.tema_id
AND k.datum > l.datum
GROUP BY t.cim, u.nick
ORDER BY 1,2Nekem meg ugye az a darabszám kell, ami a user-téma viszonylatban később íródott, mint ahogy a user meglátogatta a témát.
-
Taybore
aktív tag
Na nem sikerült célba érnem. A gond szerintem az, hogy kellene az összes U és összes T, de a nem tudom őket összekapcsolni közvetlenül, csak az M-en keresztül, és nem tudom hova kéne a JOIN. Ráadásul meg van még bonyolítva ugye L-el, amiben nincs meg a mind-mind kapcsolat T-re és U-ra.
Azt hiszem valami olyasmit szeretnék, ami ORACLE-ben így nézhet ki:
(a dátumhoz nem tudom pontosan, hogy kellene-e a +)
SELECT u.nick, t.cim, count(1)
FROM tema t, user u, megosztas m, komment k, temalatogatas l
WHERE m.user_id = u.user_id
AND m.tema_id = t.tema_id
AND l.user_id (+) = u.user_id
AND l.tema_id (+) = t.tema_id
AND k.tema_id = t.tema_id
AND k.datum > l.datum (+)
GROUP BY u.nick, t.cimSajna már 3 napja ezzel a problémával küzdök

-
Taybore
aktív tag
Válasz #4 és #5-re (kb ugyanazt írtátok):
köszi, azt hiszem a logikája így érthető. Ezt az apróságot nem tudtam, amúgy hidd el, próbálkoztam én már mindenféle kombinációval, de sehogy se az jött ki, amit szerettem volna. Ennek a tudásnak a birtokában újra nekiülök próbálkozni
Azért pedig elnézést, hogy nem a nagy MySQL topicba írtam, csak rákerestem a két kifejezésre, és nem talált egyezést, ezért bátorkodtam új témát nyitni. -
Taybore
aktív tag
Azért nem, mert mint írtam, nem tudom hogyan kéne. Ha tudnám, és azt használnám, akkor nem nyitottam volna meg a topicot.
Azt tudom (kismillió helyen leírták), hogy hogyan működik a JOIN, de mindenhol 2 táblára vonatkoztatnak. Nálam (mint láthat) bonyolultabb a helyzet, mivel összekötő táblák is vannak (M és L). Azt nem tudom, hogy melyik táblát (valószínüleg L-t), melyikhez kell milyen JOIN-olni, és milyen sorrendben. Mi kerül az ON részbe és mi marad a WHERE-ben?
Szerk.: Ja és nem olyan táblák kellenek, amikhez nincs megosztás, hanem, amikhez van X usernek megosztása, de nincs látogatás rekordja. (Feltételezhetjük, hogy minden témához van legalább 1 megosztott user, pont aki létrehozta a témát.) -
Taybore
aktív tag
Sziasztok!
Remélem van köztetek valaki, aki perfect MySQL szakértő, mert több táblás kapcsolat lekérdezésre lenne szükségem és nem vagyok túl jártas a laza kapcsolatokban.
Alapszitu:
Van 5 tábla egy fórum motorban (php-s cucc): téma AS T, user AS U, komment AS K, megosztás AS M, látogatás AS L
A dolog úgy működik, hogy a témákat csak azok a userek láthatják (írhatnak kommentet), amik meg van osztva velük. Tehát van egy rekord M-ben U.id és T.id értékekkel. Amikor "belép" egy témába, akkor L-be felíródik a T.id, U.id és a dátum. Természetesen K-ban is van U.id, T.id és dátum.
Nekem egy olyan lekérdezés kéne, amiben kiírja a T.cim, U.nick és count(új kommentek)
Az új kommenteken azt értem (témánként), ahol K.dátum > L.dátum.
Eddig ezt az SQL-t írtam hozzá:SELECT u.nick, t.cim, count(1)
FROM tema t, user u, megosztas m, komment k, temalatogatas l
WHERE m.user_id = u.user_id
AND m.tema_id = t.tema_id
AND l.user_id = u.user_id
AND l.tema_id = t.tema_id
AND k.tema_id = t.tema_id
AND k.datum > l.datum
GROUP BY u.nick, t.cimA probléma az, hogy ha van olyan téma, ami meg van osztva adott userral, de még sose lépett be, akkor nincs témalátogatás rekordja. Ezt kéne valahogy laza kötéssel (LEFT-RIGHT JOIN) megoldani. Az eredmény tehát az kéne hogy legyen, hogy ki, melyik témából hány kommentet nem olvasott még el.
Baromira remélem, hogy érthetően írtam le, és nem hagytam ki semmit.
Előre is köszi a segítséget!
Aktív témák
- Lenovo ThinkPad T14 Gen 1 i5-10210 / 16GB RAM/ 256GB NVMe SSD világítós EU bill, kiváló állapotban
- vizes GAMER PC - RYZEN 5 7600X / 32GB DDR5 / RTX 5070 12GB
- HP EliteBook 840 G7 i5-10210U / 16GB RAM / 256GB SSD Szép állapot, EU bill, gyári töltő
- A KINCS ! Új HP EliteBook 860 G10 Profi Fémházas Laptop -50% 16" i7-1355U 32/1TB FHD+ IPS MATT
- Dobozos DELL Inspiron 16 Fémházas Multimédiás Laptop 16" -30% Ryzen 7 8840U 8mag 16/1TB FHD+ IPS
- Beszámítás! MSI G27C4 E3 27 180Hz FHD VA 1ms gamer monitor garanciával hibátlan működéssel
- 14" Dell Latitude laptopok: 5400, 5480, 5490, 7480, E6410, E6440, E5450 / SZÁMLA + GARANCIA
- MSI GF65 Thin - 15,6"FHD 120Hz IPS - i5-9300H - 16GB - 1,25TB SSD - Win11 - GTX 1660 Ti - MAGYAR
- Bomba ár! Lenovo ThinkPad L380 i3-8G I 8GB I 128SSD I 13,3" FHD I Cam I W11 I Garancia!
- LG 32GS75QX-B - 32" IPS - 2560x1440 - 180Hz 1ms - AMD FreeSync Premium - NVIDIA G-Sync - sRGB 99%
Állásajánlatok
Cég: Laptopműhely Bt.
Város: Budapest






