Hirdetés
- Samsung Galaxy S21 FE 5G - utóirat
- Visszatérnek a Samsung tervezte CPU-magok és GPU az Exynos 2800-ban?
- Yettel topik
- Xiaomi 13T és 13T Pro - nincs tétlenkedés
- OnePlus 15 - van plusz energia
- Samsung Galaxy S25 Ultra - titán keret, acélos teljesítmény
- iPhone topik
- Apple iPhone 15 Pro Max - Attack on Titan
- A piac legerősebb kameráját ígéri a Xiaomi 17 Ultra
- 2026-ban nem lesz új Asus telefon, de nem zárják be a boltot
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
- Autós topik
- YouTube
- exHWSW - Értünk mindenhez IS
- Ultrakönnyű Logitech "G305" egér? Úgy tűnik, igen!
- A legrosszabb CPU-k – az ExtremeTech szerint
- Tesla topik
- Folyószámla, bankszámla, bankváltás, külföldi kártyahasználat
- Elektromos cigaretta 🔞
- World of Tanks - MMO
- Samsung Galaxy S21 FE 5G - utóirat
- További aktív témák...
- Szép! Lenovo Thinkpad T14s G2 Üzleti "Golyóálló" Laptop 14" -50% i5-1135G7 4Mag 16GB/512GB FHD IPS
- Bomba ár! Lenovo ThinkPad Yoga 370 - i5-G7 I 8GB I 256SSD I 13,3" FHD Touch I W11 I Cam I Gari!
- Bomba ár! Lenovo ThinkPad Yoga 260 - i5-G6 I 8GB I 256SSD I 12,5" Touch I W11 I Cam I Gari!
- HP EliteBook 850 G8 Fémházas Tartós Laptop 15,6" -65% i7-1165G7 16/512 Iris Xe FHD
- Bomba ár! Lenovo ThinkPad X390: i5-G8 I 16GB I 256-1TSSD I 13,3" FHD Touch I HDMI I Cam I W11 I Gar
- Bomba ár! HP EliteBook 820 G1 - i5-4GEN I 8GB I 500GB I 12,5" HD I Cam I W10 I Garancia!
- iPhone 12 Mini 64GB 100% (GARANCIÁBAN CSERÉLT)
- Eladó Apple iPhone 12 64GB / AKKU 100% / 12 hónap jótállás
- Dell Latitude 7470 14" QHD IPS touch, i5 6300U, 8GB RAM, SSD, jó akku, számla, 6 hó gar
- Okosóra felvásárlás!! Samsung Galaxy Watch 5 Pro, Samsung Galaxy Watch 6 Classic
Állásajánlatok
Cég: Laptopszaki Kft.
Város: Budapest
Cég: PCMENTOR SZERVIZ KFT.
Város: Budapest








