- Android alkalmazások - szoftver kibeszélő topik
- Profi EKG-s óra lett a Watch Fitből
- Honor 400 Pro - gép a képben
- Samsung Galaxy S21 és S21+ - húszra akartak lapot húzni
- Honor Magic7 Pro - kifinomult, költséges képalkotás
- Samsung Galaxy A54 - türelemjáték
- Milyen okostelefont vegyek?
- Telekom mobilszolgáltatások
- Apple iPhone 16 Pro - rutinvizsga
- India felől közelít egy 7550 mAh-s Redmi
Új hozzászólás Aktív témák
-
#68216320
törölt tag
Pici segítség kellene mert elfelejtettem a jó megoldást egy problémára.
Van egy files nevű táblám. Ebben többek között vannak name (vchar) és version (float) mezők.
Azt szeretném megoldani, hogy egy amúgy több feltételből álló SELECT-ben az azonos nevűekből csak a legnagyobb verziószámú szerepeljen.Tehát:
elemek:
file1 - 1.0
file1 - 1.1
file2 - 1.0
file2 - 0.9
---------------------
eredmény:
file1 - 1.1
file2 - 1.0 -
#68216320
törölt tag
foglalasok: (id, user_id, esemeny_id, berlet_id)
esemenyek: (id, nev, helyszin_id, idopont)Azokat az eseményeket kellene listáznom, amik még aktuálisak és amikre nem foglalt a felhasználó (user_id) még helyet.
SELECT e.id, e.nev, e.idopont FROM esemenyek e LEFT OUTER JOIN foglalasok f ON f.esemeny_id=e.id WHERE e.idopont>NOW() AND f.user_id!='%d'
Ez hibás. Segítenétek megtalálni a hibát?
-
#68216320
törölt tag
válasz
martonx #1155 üzenetére
Csak egy minta volt, nem használom. Nem is futtattam le, mert az elv nem tetszett, hogy minden listázásnál/oldalfrissítésnél folyton kiszámolja ugyanezt. Természetesen vannak indexek.
Köszönöm a segítséget, de mint írtam már a táblaszerkezet esett át változtatáson és így nincs felesleges művelet. Csak akkor számoltatok vele, mikor tényleges változtatás történik és az eredményt update-olom. Így becslések alapján kisebb erőforrás igénye lesz, ugyanis lényegesen ritkább lesz az insert/update a select-nél. -
#68216320
törölt tag
válasz
Peter Kiss #1153 üzenetére
Egyik sem. Hanem ezzel a táblaszerkezettel a LEFT JOIN és Group By sajnos nem elkerülhető, ami esetemben piszok sok sort eredményezne teljesen feleslegesen. Gyakorlatilag az elméleti része volt hibás, hisz miért számoljon minden lekérdezésnél, ha ugyanaz lesz az eredmény. De már megoldódott, kis változtatással, optimalizálással.
select p.*, avg(eb.ertek_szam), avg(ep.ertek_szam) from pinceszetek p
left join borok b on p.id = b.pinceszet_id
left join ertekelt_borok eb on eb.bor_id = b.id
left join ertekelt_pinceszetek ep on ep.pince_id = p.id
group by p.id;Ez egy leegyszerűsitett verzió, tökéletesen működik, de lassú.
pl. 3000 pincészet, pincészetenként 15 bor, boronként 50 értékelés. felesleges sorok a join miatt. ennyi. -
#68216320
törölt tag
válasz
Apollo17hu #1151 üzenetére
Sajnos kiderült, hogy nagy mennyiségű adat esetén piszkosul erőforrás igényes lesz. Feleslegesen számol átlagot minden listázásnál. Akkor számoltatok csak vele, mikor új értékelés érkezik és az eredményt eltárolom a borhoz update-el. Onnét már sima ügy lesz csak olvasni, mikor kell.
-
#68216320
törölt tag
válasz
martonx #1148 üzenetére
SELECT
p.id AS pinceszet_id,
p.nev AS pinceszet_nev,
(
SELECT AVG(ertek_szam)
FROM ertekelt_borok
WHERE ertekelt_borok.bor_id=b.id
) AS pinceszet_boratlag
FROM pinceszetek AS p
LEFT JOIN borvidekek AS bv ON p.borvidek_id=bv.id
LEFT JOIN telepulesek AS t ON p.telepules_id=t.id
LEFT JOIN borok AS b ON b.pinceszet_id=p.id
LEFT JOIN ertekelt_borok AS eb ON eb.bor_id=b.idEzzel odáig jutottam, hogy listázza a pincészeteket, de amelyiknek a boraihoz mondjuk 5 értékelés van, akkor az 5 sort is ad vissza.
Illetve boronként kapom meg az átlagot minden sorban. -
#68216320
törölt tag
válasz
martonx #1148 üzenetére
Az, hogy szerintem egymásba ágyazott SELECT-re lesz szükség, amit nem tudom hogyan csináljak meg.
A pincészetek listázása közben a pincészet ID alapján ki kéne jelölnöm az összes borát, azoknak az értékeléseiből pedig átlagot számolni, amit a pincészet többi adata mellett vissza kellene adnom. -
#68216320
törölt tag
Újabb problémába ütköztem hiányos SQL ismereteim miatt. Segítséget kérnék.
táblák (nem az összes mezővel, csak ami hirtelen kell)
borok (id, nev, pinceszet_id)
pinceszetek (id, nev, borvidek_id, telepules_id)
borvidekek (id, nev)
telepulesek (id, telepules)
ertekelt_borok (id, bor_id, ertek_szam)
ertekelt_pinceszetek (id, pinceszet_id, user_id, ertek_szam)a lekérés amíg megirtam:
SELECT
p.id AS pinceszet_id,
p.nev AS pinceszet_nev,
t.telepules AS telepules_nev
FROM pinceszetek AS p
LEFT JOIN borvidekek AS bv ON p.borvidek_id=bv.id
LEFT JOIN telepulesek AS t ON p.telepules_id=t.idamiket vissza kellene kapnom:
- pinceszet id
- pinceszet nev
- borvidék név
- település név
- pincészet értékelések számaés a komplikáció:
- az adott pincészet borainak értékelése alapján (1-5) a pincészet értékelése (1-5) -
#68216320
törölt tag
válasz
fordfairlane #1142 üzenetére
Persze, egyértelmű köszönöm. Egy félig megírt rendszerbe kerülnek az új részek, ezért nem akartam nagyon eltérni az ott lévő dolgoktól. Majd azért belecsempészem és újat már ezzel írok.
-
#68216320
törölt tag
válasz
#68216320 #1135 üzenetére
Közben lehet, hogy megtaláltam a megoldást. Szerintem túlkombinálhattam.
Ezt lehetne megoldás illetve lehet esetleg szebben?SELECT tk.id AS termekId, tk.nev AS termekNev, gy.nev AS gyartoNev, ts.nev AS telepulesNev
FROM termek AS tk
LEFT JOIN gyarto AS gy ON gy.id=tk.gyarto_id
LEFT JOIN telepules AS ts ON gy.telepules_id=ts.id
WHERE tk.id = '$telepules_id' -
#68216320
törölt tag
| termek | | gyarto | | telepules |
|-----------| |--------------| |-----------|
| id | | id | | id |
| nev | | nev | | nev |
| gyarto_id | | telepules_id | -----------
----------- --------------Termékeket listáznék. Azokat kellene, akiknek a gyártója mondjuk telepules_id telephellyel rendelkezik.
Nem sikerül összehoznom a szűkítést. Segítséget kérnék. -
#68216320
törölt tag
törölve
Új hozzászólás Aktív témák
Hirdetés
- iPhone-t használók OFF topikja
- Luck Dragon: Asszociációs játék. :)
- Milyen videókártyát?
- Melyik tápegységet vegyem?
- Elektromos rásegítésű kerékpárok
- Milyen asztali (teljes vagy fél-) gépet vegyek?
- Milyen légkondit a lakásba?
- sziku69: Szólánc.
- sziku69: Fűzzük össze a szavakat :)
- Nyaralás topik
- További aktív témák...
- Apple iPhone 16 Pro Max - Natural Titanium - Újszerű - 1 töltési ciklus - 2026. 05. 13.-ig Apple gar
- Csere-Beszámítás! Ryzen 9 9950X3D Processzor! 16Mag-32Szál!
- Lenovo ThinkPad X1 Carbon G8, i7-10510U, 16GB, 1TB SSD, 4K kijelző + WWAN (ELKELT)
- DELL PowerEdge R730xd 12LFF+2SFF rack szerver - 2xE5-2680v3,64GB RAM,4x1GbE,H730 RAID v ZFS
- Telefon felvásárlás!! iPhone 11/iPhone 11 Pro/iPhone 11 Pro Max
Állásajánlatok
Cég: Promenade Publishing House Kft.
Város: Budapest
Cég: CAMERA-PRO Hungary Kft
Város: Budapest