Hirdetés
- Valami baja van a tápomnak
- Bambu Lab 3D nyomtatók
- Milyen egeret válasszak?
- 5.1, 7.1 és gamer fejhallgatók
- Milyen TV-t vegyek?
- Azonnali notebookos kérdések órája
- AMD Ryzen 9 / 7 / 5 9***(X) "Zen 5" (AM5)
- Harcba és Rómába vezet az új AMD Software
- Milyen monitort vegyek?
- Fejhallgató erősítő és DAC topik
Új hozzászólás Aktív témák
-
bpx
őstag
válasz
don_peter
#1731
üzenetére
Feltételeztem, hogy olyan eset nem fordul elő, hogy egy fórum üzenethez nem létezik user (mert usert általában nem törlünk, csak inaktiválunk), és így nem kell ezek közé is outer join, de egyébként igen.
Ezen kívül, ha van rá igény, azt kellene még megcsinálni, hogy a topikonként a legújabb hozzászólás dátumát és felhasználóját helyesen összegyűjteni, mert egy ilyen GROUP BY-t egy szigorúbb adatbáziskezelő (pl. DB2, MSSQL, Oracle) kapásból visszadob hibával, mert nem determinisztikus az eredmény. (Azt, hogy a MySQL egyáltalán megenged ilyet, én inkább hiányosságnak tartom, mint feature-nek - OK, kikapcsolható ez a működés.)
MySQL-ben sajnos nincsenek analitikus függvények, helyette vannak ilyen kerülő megoldások:
Végül limitálni kellene, hogy hány sort kapunk vissza, hogy ne dolgozzon esetleg feleslegesen az adatbázis, és gondolom a felhasználónak sem a létező összes, akár több száz, ezer topikot rakod ki felületre, hanem csak egy fix mennyiséget, ahogy pl. itt a prohardveren is működik.
-
bpx
őstag
válasz
don_peter
#1729
üzenetére
Ha azok a topikok kellenek, amelyekben nincs hozzászólás, akkor miért a forum_uzenetek van a LEFT JOIN bal oldalán?
forum_uzenetek fu
LEFT JOIN topik t
ON fu.topik_id = t.idEz azt jelenti, hogy azokat fórum üzeneteket is kéred, amelyek egyik topikhoz sem tartoznak.
forum_uzenetek LEFT JOIN topik + UNION bonyolítás helyett nem egyszerűbb lenne a topik LEFT JOIN forum_uzenetek?
-
don_peter
senior tag
válasz
don_peter
#1728
üzenetére
No ez már jó

Hátha tudok vele segíteni...
Aki tud ennél egyszerűbb megoldást az kérem ossza meg velem.
Köszönöm.SELECT * FROM
(SELECT * FROM
(SELECT t.id, t.title, fu.datum, u.nick
FROM forum_uzenetek fu
LEFT JOIN topik t
ON fu.topik_id = t.id
JOIN users u
ON u.id = fu.user_id
WHERE t.topik_csoport_id = 9
ORDER BY fu.datum DESC) AS a
UNION
SELECT t.id, t.title, "1970-01-01" as datum, NULL as nick
FROM topik t
where t.topik_csoport_id = 9
) c
GROUP BY id ORDER BY datum DESC -
don_peter
senior tag
válasz
don_peter
#1727
üzenetére
Nos kicsi átalakítással már működik is és elég gyors 0.1mp-es lefutási időt produkál.
SELECT * FROM
(SELECT * FROM
(SELECT t.id, t.title, fu.datum, u.nick
FROM forum_uzenetek fu
LEFT JOIN topik t
ON t.id = fu.topik_id
JOIN users u
ON u.id = fu.user_id
WHERE t.topik_csoport_id = 9) as a
GROUP BY a.id
UNION
SELECT t.id, t.title, "1970-01-01" as datum, NULL as nick FROM topik t where t.topik_csoport_id = 9) c
GROUP BY id ORDER BY datum DESCKöszi a segítséget és az elvi rávezetést...
ui: öhh, még sem jó..
Nem jól szelektálja az utolsó bejegyzéseket.
Ennek még utána nézek.. -
Apollo17hu
őstag
válasz
don_peter
#1725
üzenetére
Az előbb lehet, hogy részben hülyeséget írtam, de valahogy így gondoltam:
SELECT c.* FROM
((SELECT a.id, a.title, a.datum, a.nick FROM
(SELECT t.id,
t.title,
fu.datum,
u.nick
FROM forum_uzenetek fu
LEFT JOIN topik t
ON t.id = fu.topik_id
JOIN users u
ON u.id = fu.user_id
WHERE t.topik_csoport_id = 9) AS a
GROUP BY a.id) b
UNION
(SELECT t.id, t.title, 1000-01-01 as datum, NULL as nick FROM topik t) seged) c
GROUP BY c.id
ORDER BY c.datum DESC...tehát minden topikhoz létrehozol egy 1000-01-01 dátumra vonatkozó hsz.-t, ami csak akkor számít a sorrendben, ha nincs rajta kívül más hsz. (tehát ha üres a fórumtéma).
-
Apollo17hu
őstag
válasz
don_peter
#1714
üzenetére
Akkor két allekérdezés kell:
- az egyikben listázod topikonként a legfrissebb hsz.-ek dátumát,
- a másikban pedig leszeded topikonként a userek legfrissebb hsz.-eit.Ezt a kettőt topik-topik és dátum-dátum kötéssel kötve ezt kapod:
SELECT topik_datum.title,
topik_user_datum.nev,
topik_datum.updatum
FROM (SELECT t.id AS tid,
t.title AS title,
MAX(fu.datum) AS updatum
FROM forum_uzenetek AS fu,
topik AS t
WHERE fu.topik_id = t.id
GROUP BY t.id,
t.title) AS topik_datum,
(SELECT t.id AS tid,
u.nick AS nev,
MAX(fu.datum) AS updatum
FROM forum_uzenetek AS fu,
topik AS t,
users AS u
WHERE fu.topik_id = t.id
AND u.id = fu.user_id
GROUP BY t.id,
u.id) AS topik_user_datum
WHERE topik_datum.tid = topik_user_datum.tid
AND topik_datum.updatum = topik_user_datum.updatum
ORDER BY topik_datum.updatum DESC LIMIT 8Hogy milyen gyorsan fut le, az jó kérdés, de analitikus függvények nélkül ennél jobbat nem tudok.

-
Apollo17hu
őstag
-
Apollo17hu
őstag
válasz
don_peter
#1706
üzenetére
MySQL tud analitikus függvényeket? Ha igen, akkor én valahogy így csinálnám:
SELECT x.*
FROM (SELECT t.id AS tid,
t.title AS title,
fu.datum AS updatum,
u.nick AS nev
rank() OVER (PARTITION BY t.id ORDER BY fu.datum DESC) AS sorrend
FROM forum_uzenetek AS fu,
topik AS t,
users AS u
WHERE fu.topik_id = t.id
AND u.id = fu.user_id) AS x
WHERE x.sorrend = 1Amúgy az a nyolcas limit mi akar lenni a lekérdezéseidben?
-
don_peter
senior tag
válasz
don_peter
#1705
üzenetére
Gondolok itt ilyesmire:
SELECT t.id AS tid,
t.title AS title,
MAX(fu.datum) AS updatum,
u.nick AS nev
FROM forum_uzenetek AS fu,
topik AS t,
users AS u
WHERE fu.topik_id = t.id AND u.id = fu.user_id
GROUP BY t.id,
t.title
u.id
ORDER BY `updatum` DESC LIMIT 8Vagy ezt tovább már nem lehet feszegetni?
-
Apollo17hu
őstag
válasz
don_peter
#1698
üzenetére
Ha topikonként a legfrissebb bejegyzésre van szükséged, akkor valahogy így kellene:
SELECT t.id AS tid,
t.title AS title,
MAX(fu.datum) AS updatum
FROM forum_uzenetek AS fu,
topik AS t
WHERE fu.topik_id = t.id
GROUP BY t.id,
t.titleEz mondjuk nem MySQL, de a kétszeri sorbarendezést (ORDER BY) kiváltja egy aggregáló függvény, ami valószínűleg gyorsít rajta.
-
martonx
veterán
válasz
don_peter
#1683
üzenetére
Segítettem is, sőt szerintem az én segítségem lesz a leghasznosabb, hiszen közel nulla ráhatásod van a dologra, így a szolgáltató kezében vagy, és én pont oda irányítottalak.
De ha már csak egy pici részletet is mutattál a kódodból, akkor az ember hagy tegyen finom utalást annak szakmaiatlan mivoltára. Ezen be lehet sértődni és mindent hagyni ugyanúgy (elvégre sok légy nem tévedhet), vagy pozitívan is lehet fogadni, és meg is lehet írni normálisra. -
martonx
veterán
válasz
don_peter
#1677
üzenetére
"Milyen izé, és milyen ledegradáló jelző az, hogy tákoltad.?"
Bocsi, akkor meg is van, hogy ki tákolta, össze, te. A kódot látva az a legkisebb baj, hogy miért lett most lassú. Sőt inkább azon csodálkozok, hogy miért nem volt lassú eddig
De, hogy konstruktív is legyek, tényleg nézd meg az indexeket, illetve én jelezném az üzemeltetőnek, hogy nagyságrendekkel lassabb lett az új mysql, és konfigolják be normálisan legyenek szívesek.
-
sonar
addikt
válasz
don_peter
#1679
üzenetére
Az időt általában a program irja ki alul. Ilyesmit kell keresned, hogy query executed, row set... és többnyire ms-ben (milisec) vagy rosszabb esetben sec -ben irja ki.
Mi a közvetlen felület nálad?
command line mysql? v phpmyadmin? query browser, workbenchazt még meg tudod nézni, hogy az indexeket használja-e.
-
-
sonar
addikt
válasz
don_peter
#1674
üzenetére
Szúrd be az EXPLAIN-t a query-d elé és meglátod, hogy mennyi idő alatt fut le és mennyi sort vizsgál át.
Igy ha módositgatsz, könnyebben össze tudod hasonlitani az eredményeket.
Szedd szét darabokra a query-t és nézd meg, hogy melyik a leglassabb aztán lehet gondolkodni tovább -
don_peter
senior tag
válasz
don_peter
#1673
üzenetére
A példában látható, hogy a fő formon belül van egy subselect.
A subselecthez érve az SQL egy újabb ciklusba kezd amely addig fut amíg kigyűjti, hogy az adott fórumbejegyzést író felhasználónak mennyi az eddigi összes bejegyzéseinek száma.
Amikor ez megvan akkor tovább lép és folytatja a parancsok végrehajtását.
Eddig ez a lekérdezési forma tökéletes és gyors volt, de most állítólag az új verzió élesítésével a rendszer korlátozza az erőforrásigényeket ezért tapasztalható a lassulás.
Tény és való, hogy van olyan felhasználó akinek több mint 5e bejegyzése van és ekkora számú rekordnál már ez a fajta struktúra erőforrás pocséklónak tűnhet.
A példa nem az eredeti adatbázist tükrözi, de a struktúra megegyezik.Váram megtisztelő javaslataitokat és segítségeteket.
Új hozzászólás Aktív témák
- DELL Latitude 5310 13.3" FHD 2in1 Touchscreen laptop I5-10310U 16G/512G Win11 Pro, Üzletből, 27%ÁFÁs
- XIAOMI Redmi Note 14 Pro 5G 8/256
- POINT S WINTER S 185/65R15 88T téligumi acélfelnivel
- ThinkPad 15,6",core i3 6100u(4x2,3Ghz)IntelHD VGA,8-16GB RAM,240SSD,Jó akku,nagyon szép állapot
- 12700kf,RTX4060 8gb,32gb ddr5,6T m.2 ssd,stb .Új komplett középkategóriás gamer pc .
- Lenovo ThinkCentre M920q/ Dell OptiPlex 3070/ Hp EliteDesk 800 G4-G5 mini, micro PC-Számla/garancia
- Bomba ár! Lenovo ThinkPad T490 - i5-8GEN I 8GB I 256GB SSD I 14" FHD I Cam I W10 I Garancia!
- Telefon felvásárlás!! Xiaomi Redmi 9, Xiaomi Redmi 9AT, Xiaomi Redmi 10, Xiaomi Redmi 10 2022
- BESZÁMÍTÁS! MSI Z390-A Pro Z390 chipset alaplap garanciával hibátlan működéssel
- Felújított laptopok számlával, garanciával! Ingyen Foxpost!
Állásajánlatok
Cég: Laptopműhely Bt.
Város: Budapest
Cég: PCMENTOR SZERVIZ KFT.
Város: Budapest




