Permalänk
Medlem

Problem med fråga i MYSQL

SKa försöka göra detta så enkelt och tydligt som jag bara kan.

Problemet:

Jag har ett table i min databas som innehåller transfers till och från olika virtuella låtsasplånböcker.

Det jag försöker göra är att skapa en fråga som isolerar vissa fält.

Så här ser mitt table ut när jag letar efter folk som skickat 10,000,000 eller multiplar av det med andledninged plottery1:

mysql> select * from charwalletjournal where amount mod 10000000 = 0 and reason = 'plottery1';
+------------+------------+-------------+--------+----------+-------------+---------------------+------------+------------+---------------+------------+-----------+------------+-----------+
| ownerID | accountKey | amount | argID1 | argName1 | balance | date | ownerID1 | ownerID2 | ownerName1 | ownerName2 | reason | refID | refTypeID |
+------------+------------+-------------+--------+----------+-------------+---------------------+------------+------------+---------------+------------+-----------+------------+-----------+
| 2063729792 | 1000 | 30000000.00 | 0 | | 34987000.00 | 2009-08-25 07:43:00 | 663894813 | 2063729792 | michael weels | plottery | plottery1 | 1542412731 | 10 |
| 2063729792 | 1000 | 10000000.00 | 0 | | 44987000.00 | 2009-08-25 07:43:00 | 663894813 | 2063729792 | michael weels | plottery | plottery1 | 1542413448 | 10 |
| 2063729792 | 1000 | 10000000.00 | 0 | | 54987000.00 | 2009-08-25 07:44:00 | 663894813 | 2063729792 | michael weels | plottery | plottery1 | 1542413826 | 10 |
| 2063729792 | 1000 | 20000000.00 | 0 | | 80987000.00 | 2009-08-25 09:47:00 | 1143461369 | 2063729792 | babyblade | plottery | plottery1 | 1542710549 | 10 |
+------------+------------+-------------+--------+----------+-------------+---------------------+------------+------------+---------------+------------+-----------+------------+-----------+
4 rows in set (0.00 sec)

Det jag försöker göra är att isolera dessa fält: ownername1, date, reason och amount.

Frågan ska alltså summera alla transkationer av t.ex michael weels, det första jag kom på var att prova detta:

SELECT amount
, reason
, ownername1
, date
, sum( amount )/10000000 as num_tickets
, sum( amount ) as total
from charwalletjournal
where amount mod 10000000 = 0
and reason = 'plottery1'
order by 'date'
;

problemet med det är att frågan summerar amount som det ska, men visar allting på michael weels:

+-------------+-----------+---------------+---------------------+-------------+-------------+
| amount | reason | ownername1 | date | num_tickets | total |
+-------------+-----------+---------------+---------------------+-------------+-------------+
| 30000000.00 | plottery1 | michael weels | 2009-08-25 07:43:00 | 7.000000 | 70000000.00 |
+-------------+-----------+---------------+---------------------+-------------+-------------+
1 row in set (0.02 sec)

Saken är den att michael weels har ghort 5 transaktioner, inte 7, 2 av dom som summeras i total kommer från babyblade.. så resultatet jag söker är alltså:

+-------------+-----------+---------------+---------------------+-------------+-------------+
| amount | reason | ownername1 | date | num_tickets | total |
+-------------+-----------+---------------+---------------------+-------------+-------------+
| 50000000.00 | plottery1 | michael weels | 2009-08-25 07:43:00 | 5.000000 | 50000000.00 |
| 20000000.00 | plottery1 | babyblade | 2009-08-25 07:43:00 | 2.000000 | 20000000.00 |
+-------------+-----------+---------------+---------------------+-------------+-------------+
1 row in set (0.02 sec)

Någon som kan hjälpa mig ordna detta?

Visa signatur

SNÄLLA CITERA MIG OM NI VILL ATT JAG SKA HITTA TILLBAKS TILL TRÅDEN

Permalänk
Medlem

Släng med en GROUP BY i din fråga eftersom SUM är en aggregeringsfunktion.

Visa signatur

Bra, snabbt, billigt; välj två.

Ljud
PC → ODAC/O2 → Sennheiser HD650/Ultrasone PRO 900/...
PC → S.M.S.L SA300 → Bowers & Wilkins 607

Permalänk
Medlem

Vart då typ? Provade efter order by, men fick error

Visa signatur

SNÄLLA CITERA MIG OM NI VILL ATT JAG SKA HITTA TILLBAKS TILL TRÅDEN

Permalänk
Medlem

Före ORDER BY, precis som det står i dokumentationen. Du vill ha med alla kolumner som inte påverkas av SUM, d.v.s.:

GROUP BY amount, reason, ownername1, date

Visa signatur

Bra, snabbt, billigt; välj två.

Ljud
PC → ODAC/O2 → Sennheiser HD650/Ultrasone PRO 900/...
PC → S.M.S.L SA300 → Bowers & Wilkins 607

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av Phod
Före ORDER BY, precis som det står i dokumentationen. Du vill ha med alla kolumner som inte påverkas av SUM, d.v.s.:

GROUP BY amount, reason, ownername1, date

Tack, det fungerade, dock är inte resultatet riktigt som önskat, det jag får är istället:

+-------------+-----------+---------------------+-----------+---------------+-------------+-------------+
| amount | reason | date | reason | ownername1 | num_tickets | total |
+-------------+-----------+---------------------+-----------+---------------+-------------+-------------+
| 30000000.00 | plottery1 | 2009-08-25 07:43:00 | plottery1 | michael weels | 3.000000 | 30000000.00 |
| 10000000.00 | plottery1 | 2009-08-25 07:44:00 | plottery1 | michael weels | 1.000000 | 10000000.00 |
| 20000000.00 | plottery1 | 2009-08-25 09:47:00 | plottery1 | babyblade | 2.000000 | 20000000.00 |
| 10000000.00 | plottery1 | 2009-08-25 07:43:00 | plottery1 | michael weels | 1.000000 | 10000000.00 |
+-------------+-----------+---------------------+-----------+---------------+-------------+-------------+
4 rows in set (0.01 sec)

Men det är ok .. Hursom, försöker utse en "vinnare" på random genom:
mysql> select * from charwalletjournal where amount mod 10000000 = 0 and reason= 'plottery1' order by rand() limit 1;

Men jag tycker output nästan alltid pekar mot den som har flest entry's i databasen .. Något jag kan göra för att få lite bättre randomisering?

Visa signatur

SNÄLLA CITERA MIG OM NI VILL ATT JAG SKA HITTA TILLBAKS TILL TRÅDEN

Permalänk
Medlem

Doh! "GROUP BY ownername1" ska det givetvis vara, men innehållet i kolumnerna amount och date är då odefinierat eftersom de inte omfattas av någon aggregeringsfunktion.

Visa signatur

Bra, snabbt, billigt; välj två.

Ljud
PC → ODAC/O2 → Sennheiser HD650/Ultrasone PRO 900/...
PC → S.M.S.L SA300 → Bowers & Wilkins 607

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av Phod
Doh! "GROUP BY ownername1" ska det givetvis vara, men innehållet i kolumnerna amount och date är då odefinierat eftersom de inte omfattas av någon aggregeringsfunktion.

Fungerade ännu bättre!

Finns det något jag kan göra för att summera num_tickets så att den visar totala tickets som är sålda?

Visa signatur

SNÄLLA CITERA MIG OM NI VILL ATT JAG SKA HITTA TILLBAKS TILL TRÅDEN

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av devhdc
Men det är ok .. Hursom, försöker utse en "vinnare" på random genom:
mysql> select * from charwalletjournal where amount mod 10000000 = 0 and reason= 'plottery1' order by rand() limit 1;

Men jag tycker output nästan alltid pekar mot den som har flest entry's i databasen .. Något jag kan göra för att få lite bättre randomisering?

Självklart har den som har flest entries i databasen störst chans att plockas fram av en sådan fråga. Du får nog använda resultatet av din andra fråga och plocka ut en vinnare programatiskt.

Citat:

Ursprungligen inskrivet av devhdc
Fungerade ännu bättre!

Finns det något jag kan göra för att summera num_tickets så att den visar totala tickets som är sålda?

Du vill alltså ha ut värdet 7 i det här fallet? Nej, du kan inte få ut det värdet i samma query. Du måste antingen summera värdena i värdena i resultatet eller göra en ny query.

Visa signatur

Bra, snabbt, billigt; välj två.

Ljud
PC → ODAC/O2 → Sennheiser HD650/Ultrasone PRO 900/...
PC → S.M.S.L SA300 → Bowers & Wilkins 607

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av Phod
Doh!

Ursäkta för OT, tyckte detta var lustigt med tanke på din avatar ;P

Visa signatur

Kom-pa-TI-bilitet