ugrás a tartalomhoz

MySQL feltétel írása

carotin · 2014. Okt. 26. (V), 22.23
Tudom nem illik konkrét példára megoldást kérni és a google a barátom (hozzáteszem használtam) de sehogy se tudom merre induljak el.

Van egy Táblám amiben a következő oszlopok szerepelnek: id, kep_url, datum

Az szeretném elérni, hogyha a mondjuk a tábla sorai még nem érik el a 10db-ot akkor csak simán felvigye a következő sort, de amennyiben eléri a 10db-ot úgy a legrégebben felvitt rekordot frissítse az újra.

Egyesével lekérni a részeket PHP-val még talán meg tudnám csinálni, tehát lekérik hány sor van a táblában és ha nagyobb akkor egy másik lekérdezéssel berendezem időrendben aztán az utolsó sort UPDATE-elem, csak szeretném ezt egy db SQL lekérdezésbe valahogy.

Előre is köszönöm, akinek lesz valami hozzászólása.
 
1

szeretném ezt egy db SQL

Hidvégi Gábor · 2014. Okt. 26. (V), 22.44
szeretném ezt egy db SQL lekérdezésbe valahogy
Miért?
2

Ez az egész elképzelés

Joó Ádám · 2014. Okt. 26. (V), 22.55
Ez az egész elképzelés valahogy sántít. Mi a konkrét feladat, biztosan tudunk javasolni elegánsabb megvalósítást.
3

A lényeg

carotin · 2014. Okt. 27. (H), 00.25
Van egy formom ahol bárki tölthet fel képet (egyesével). Minden egyes feltöltött kép ugyan abba a könyvtárba töltődik. Felöltéskor az adatbázisba a kép nevét írom (illetve van még egy rövid üzenet amit db írok, de ez nem lényeg) illetve dátumozom.

Nos azért kellene nekem ez a dolog, mert korlátozni szeretném a mappában lévő képek mennyiségét. És mivel törlődnének a régi képek egy bizonyos szám felett így az adatbázisban is törölni kell a megfelelő sort illetve inkább update-elni.
4

Ha tényleg így akarod, akkor

Szigyártó Mihály · 2014. Okt. 27. (H), 00.43
Ha tényleg így akarod, akkor add meg kép id-nek így:
(COUNT(mező)+1)%10
5

Ez mit takar

carotin · 2014. Okt. 27. (H), 01.05
konkrétan ezaz utasítás?

Vagy rossz ez az elgondolás? Hogy csinálnátok?
6

Ebben az esetben vidd fel az

Joó Ádám · 2014. Okt. 27. (H), 01.07
Ebben az esetben vidd fel az új képet új sorba, majd töröld a tízet meghaladó korábbi sorokat. Ez utóbbit sokféleképp megteheted, akár egy utasításban is, mondjuk subquery-vel vagy joinolva egy view-t.

De szerintem egyszerűbb és felhasználóbarátabb is, ha a tíz kép után a felhasználónak előbb törölnie kell, és csak utána tölthet fel újra.
7

Köszönöm a válaszokat

carotin · 2014. Okt. 27. (H), 13.14
Egyébként nincsen account a felhasználóknak, ez egy ilyen szabadon feltölthető képtár lesz ömlesztve dátum szerint.
De akkor megcsinálom több lekérdezésből.
8

Végülis sikerült megcsinálnom

carotin · 2014. Okt. 31. (P), 00.25
Írtam egy tárolt eljárást MySQL-ben.
Bemeneti értékeknek a kep_url-t adtam meg, kimenetnek meg a frissítes előtti url-t.
Vizsgáltam a sorok számát és ettől függően vagy UPDATE vagy INSERT fut le.
UPDATE-nél visszakaom a régi url-t amit frissített az újra.

Köszönöm azért a segítséget!
9

Ne

Hidvégi Gábor · 2014. Okt. 31. (P), 10.08
Régebben mi is használtunk tárolt eljárásokat MySQL-ben, de rájöttünk, hogy macerás a karbantartásuk és a hibakeresés, jobban megéri php szinten megoldani ugyanazt a funkcionalitást. Sebességszinten is minimális az előnyük.
10

Én most azzal szembesültem

carotin · 2014. Nov. 1. (Szo), 00.37
hogy a tárhelyszolgáltatónál (hostinger.hu)nem engedélyezett a tárolt eljárások futtatása, biztonsági okokra hivatkozva. Esetleg tudtok olyan tárhelyet ahol igen?
11

talán

Pepita · 2014. Nov. 2. (V), 16.51
A dotroll de nem tudom, kérdezd meg.

Gáborral nem értek egyet: sokszor alkalmazáslogika szintjén is jobb egy tárolt eljárás, mint helyette phpben ügyeskedni. Pláne ha komolyabb eredményhalmazokról is szó van.
12

Hogy tudnám ezt a tárolt eljárás nélkül megvalósítani.

carotin · 2014. Nov. 3. (H), 18.23
Kénytelen vagyok php-ban kiadni a lekérdezéseket.
Mivel nem nagyon találtam infót arra nézve, hogy hogyan is működik a MySQL ilyen esetben amit mindjárt vázolok, kicsit tanácstalan vagyok.

Ugye az alapkoncepció az, hogy egy táblában korlátozva lenne hogy csak X db rekord vihető fel, az X+1 már a legrégebbi rekordot frissítené az újra.

Én úgy csináltam, hogy lekéri a táblában lévő rekordok számát és erre írtam egy feltételt hogy ha az nagyobb a limitnél akkor kikeresve a legrégebbit frissítse, ha viszont kisebb akkor csak írja a tábla végéhez.

Én attól félek (tudom ennek nagyon kicsi az esélye, de van rá esély) hogy az, hogy lekérem a rekordok számát egy külön lekérdezés és a feltétel eldöntése után is egy külön lekérdezést hajtok végre. De mi van akkor, ha a két lekérdezés közt szintén nyitnak egy új kapcsolatot lekéri a sorok számát és ott is ugyan az lesz a lekért érték mint az előző kapcsolatnál. Ez esetben mondjuk előfordulhat az is, hogy ha a 50 a limit a max soroknál akkor lesz 51. sor is.
13

Transaction

Poetro · 2014. Nov. 3. (H), 18.58
14

Ezt már néztem

carotin · 2014. Nov. 3. (H), 19.02
De ez biztos hogy ezzel megoldható és nem lesz "közbeékelődés"?
15

Erről szól

Poetro · 2014. Nov. 3. (H), 19.04
Pont erről szól a tranzakció, hogy az egészet atomi műveletként kezeli.
16

Ok

carotin · 2014. Nov. 3. (H), 20.04
Azt tudom hogy tranzakcióknál nem kerülnek bele azonnal az adatbázisba a lefuttatott utasítások, csak a végén amikor erre utasítást kap.

Tehát akkor egy tranzakciót, ami több lekérdezésből és bármi másból is állhat vehetem egy lekérdezésnek?
17

Isolation level

janoszen · 2014. Nov. 3. (H), 20.28
Azert az isolation levelre erdemes figyelni, itt pont lenyeges.
18

És milyen

carotin · 2014. Nov. 3. (H), 21.49
szintet érdemes beállítani?
19

Most hogy így utánnaolvasgattam

carotin · 2014. Nov. 3. (H), 22.24
gondolom hogy a REPEATABLE READ szintet elég beállítani mivel csak a tranzakciók írhatnak módosíthatnak sorokat az adott táblában. Jól gondolom?