- Android alkalmazások - szoftver kibeszélő topik
- Egy óra, két rendszer
- Samsung Galaxy A54 - türelemjáték
- Nem nyílnak a Foldok?
- Samsung Galaxy S23 és S23+ - ami belül van, az számít igazán
- Google Pixel topik
- Ár-érték bajnokot avatott a Poco?
- Amazfit Active 2 NFC - jó kör
- iOS alkalmazások
- Telekom mobilszolgáltatások
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
Hirdetés
- Trollok komolyan
- Projektor topic
- Mibe tegyem a megtakarításaimat?
- EAFC 25
- exHWSW - Értünk mindenhez IS
- Nintendo Switch 2
- AMD Navi Radeon™ RX 7xxx sorozat
- Mégsem búcsúznak a DDR4-es memóriák
- Azonnali informatikai kérdések órája
- [K2]: A vagyonvédelmi rendszerszerelővé válás rögös útja
- További aktív témák...
- L13 Yoga Gen4 13.3" FHD+ IPS érintő Ryzen 7 PRO 7730U 16GB 256GB NVMe IR kam aktív toll gar
- Samsung Galaxy S22 Plus 128GB, Kártyafüggetlen, 1 Év Garanciával
- HP Elite x2 1012 G2 Touch 2-in-1 LTE/4G Win10 Tablet billentyűzettel/Notebook, üzletből, garanciával
- Nitro AN515-57 15.6" QHD IPS i7-11800H RTX 3070 16GB 500GB NVMe gar
- Csere-Beszámítás! Playstation 5 Slim Edition + Joystick állomás! CFI-2016
- Fém, összecsukható és kihúzható fotó állvány eladó
- Eladó ÚJ csak bontott állapotban lévő Xiaomi Redmi 13C 4/128GB / 12 hó jótállás
- Targus Universal USB 3.0 DV1K-2K Compact docking station (DisplayLink)
- Lenovo X1 Yoga G6 i7-1185G7 32/512GB SSD FHD IPS Touch Win11 (lízingelt)
- Cisco Catalyst C1000-48T-4G-L 48xRJ45 4xSFP switch, CISCO refurbished
Állásajánlatok
Cég: PCMENTOR SZERVIZ KFT.
Város: Budapest