MySQL lekérdezés máshogy
Sziasztok!
A következőt találtam ki:
Adott egy iksz tábla szolgáltatásokkal pl: dátum,név,vásárlás
| id | nev | datum | vasarlas |
| 1 | Okos | 2015-01-01 | igen |
| 2 | Peter | 2015-01-05 | igen |
....
Arra lenne szükségem, hogy ki az az egyén (id, aki kéthetente legalább egyszer vásárolt egy éven keresztül. Tehát, nem 27x egy évben, hanem MINDEN második héten van legalább egy rekordja.
Ez lenne és nem tudok rájönni, hogy hogyan lehetne minél kevesebb lekérdezésből megoldani.
Köszönöm a segítséget.
Üdv:T
■ A következőt találtam ki:
Adott egy iksz tábla szolgáltatásokkal pl: dátum,név,vásárlás
| id | nev | datum | vasarlas |
| 1 | Okos | 2015-01-01 | igen |
| 2 | Peter | 2015-01-05 | igen |
....
Arra lenne szükségem, hogy ki az az egyén (id, aki kéthetente legalább egyszer vásárolt egy éven keresztül. Tehát, nem 27x egy évben, hanem MINDEN második héten van legalább egy rekordja.
Ez lenne és nem tudok rájönni, hogy hogyan lehetne minél kevesebb lekérdezésből megoldani.
Köszönöm a segítséget.
Üdv:T
Kérdés
hosszú sorok...
Mivel MySQL-ben közvetlenül
esetleg...
Mit?
az..
Attól függ, mit kérdezel le :
Próbáljuk meg lebontani a feladatot részekre: hogyan tudod eldönteni egy illetőről, hogy az adott időintervallumban (egy évben) vásárolt-e kéthetenként? Milyen lekérdezéseket futtatnál le, és a kapott adatok alapján mit ellenőriznél le?
ez az..
A lekérdezésekben azon személyek azonosítóit listáznám, akik vásároltak legalább egyszer az adott héten. Ez kb 27 lekérdezés lenne. Idáig megy is :) Itt kellene megvizsgálni, hogy kik azok, akik mind a 27 lekérdezésben szerepelnek. Ez már meghaladja a tudásomat sajnos és nem is tudom, hogy hogyan tudnám tutorialokból kibogozni.
plusz mező
Lehet külön tábla, működhet trigger alapján.
GROUP BY, MAX
Oszt jónapotkívánok.
csak minta
A problémám, hogy már 3. éve töltődik az adatbázis, tehát visszamenőleges megoldást kellene találni.
Köszi.
Érdekes feladat és én is
nem akarok..
Ne állj a programozó és a
:D
Ha van egy szkripted, akkor
persze
Szia! Az is egy megoldás,
Az is egy megoldás, hogy
Üdv:
Dávid
Egy lekérdezésből megvan.
t1.nev,
/* Vásárlások száma (kivéve első vásárlás): */
COUNT(t1.id) AS darab1,
/* Ebből folyamatos vásárlások száma: */
SUM(IF(
(SELECT
MAX(t2.datum)
FROM
tabla AS t2
WHERE
t2.nev = t1.nev
AND t2.datum < t1.datum
AND t2.datum >= DATE_SUB(t1.datum, INTERVAL 2 WEEK)) IS NOT NULL,
1,
0
)) AS darab2,
/* Az első vásárlás adata is kell: */
(
SELECT
MIN(t3.datum)
FROM
tabla AS t3
WHERE
t3.nev = t1.nev
) AS min_datum,
SUBSTRING_INDEX(GROUP_CONCAT(t1.datum ORDER BY t1.datum DESC), ',', 1) AS max_datum
FROM
tabla AS t1
WHERE
/* Második vásárlástól nézzük: */
t1.datum > (
SELECT
MIN(t3.datum)
FROM
tabla AS t3
WHERE
t3.nev = t1.nev
)
/* IDE TOVÁBBI FELTÉTELEK JÖHETNEK, PL. IDŐSZAKRA VISZGÁLÁS STB. */
GROUP BY
t1.nev
HAVING
/* A vásárlások száma és a folyamatos vásárlások száma megegyezik: */
darab1 = darab2
/* Legalább 1 év eltelt: */
AND DATE_ADD(min_datum, INTERVAL 1 YEAR) <= max_datum
Ahogy nézem, lehetne
igazam volt...
Köszi.
Ne legy kishitu, ez csak sql,
:)
Ez nem kishitűség...önismeret :))
Ha érdekel az sql (végülis
Nekem megvan
Én abból indultam ki, hogy ha
Tábla:
id | páros vagy páratlan | vásárlások száma
1 | 0 | 2
1 | 1 | 26
2 | 0 | 1
Egész osztás
Minden dátumból megkapod hogy melyik Kéthét alá tartozik, ha lesztod 14-gyel. Picit bővebben: veszed a dátum UNIX_TIMESTAMP reprezentációját, és leosztod 14 * 24 * 60 * 60 nal - a Unix timestamp másodperc alapú és ennyi másodperc van 14 napban.
Akikre igaz az állítás azoknak minden Kéthét le lesz fedve, vagyis 26 különböző ilyen rekordot produkálnak:
COUNT(DISTINCT (datum DIV 1209600)) = 26
A való életben egyetlen SQL helyett egy segédtáblába gyűjteném a vásárolásokat, aminek mezői a Kéthetet reprezentáló szám és a User id lenne. A két mezőre kombinációjára unique kulccsal. Ebbe
INSERT IGNORE SELECT ...
utasítással beletölteném az összes rekordot (így egyetlen rekord testesítené meg, hogy egy User vásárolt-e az adott Kéthétben).Innen már lehet:
Fiddle
Én így fordítanám le a probléma vélt megfogalmazását MySQL-re:
Az egyenlő bánásmód nevében a subselecteket is célszerű lehet szűrni az intervallumra, mert két 2014. december 30-án vásárló közül az, aki azóta nem vásárolt, az bekerül a listába, míg aki rá 15 napra vásárolt legközelebb az pedig nem.
Valahogy talán ki lehet trükközni, hogy csak egy subselect legyen benne, de már nem fog hozzá az agyam.