Hirdetés
- f(x)=exp(x): A laposföld elmebaj: Vissza a jövőbe!
- bambano: Bambanő háza tája
- sziku69: Fűzzük össze a szavakat :)
- Sonarr és Radarr
- eBay-es kütyük kis pénzért
- Luck Dragon: Asszociációs játék. :)
- sziku69: Szólánc.
- weiss: Logi MX Master 3S FW NEM frissítés
- Geri Bátyó: Agglegénykonyha 2 – Főzés: szabályok, vagy szabadság?
- D1Rect: Nagy "hülyétkapokazapróktól" topik
Ú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
- Lenovo Thinkpad Intel I7 - 32GB DDR4 - SSD 1TB - NVidia 4GB DDR6 - 4K LCD - Carbon Fiber/Magnesium
- Metabo PowerMaxx 12V akkus gépek és szettek 2/2
- Metabo PowerMaxx 12V akkus gépek és szettek 1/2
- Eladó ZTE MC888A 5G + router LTE Sim kártyás
- Dell Latitude 5450 14" FHD IPS ULTRA 5 135U vPRO 12 Mag 16GB RAM 512GB NVME SSD 2028-ig Gar
- Dell Latitude 5420 i7-1185G7 16GB 512GB magyarbill. 1 év garancia
- iKing.Hu - Motorola Razr 50 Ultra Midnight Blue Használt, karcmentes állapotban 12 GB RAM / 512 GB
- iPhone 12 mini 128GB Midnight -1 ÉV GARANCIA - Kártyafüggetlen, MS3335, 94% Akkumulátor
- 15,6" Dell Latitude laptopok: E6540, E5550, E5570, 5580, 5590, 5500, 5501, 5510/ SZÁMLA + GARANCIA
- HIBÁTLAN iPhone 14 128GB Blue -1 ÉV GARANCIA - Kártyafüggetlen, MS3237
Állásajánlatok
Cég: PCMENTOR SZERVIZ KFT.
Város: Budapest
Cég: CAMERA-PRO Hungary Kft.
Város: Budapest