Trädvy Permalänk
Medlem
Plats
Kristinehamn
Registrerad
Maj 2002

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?

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

Trädvy Permalänk
Medlem
Plats
Borlänge
Registrerad
Mar 2005

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

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

Ljud
PC → ODAC → Objective2 → Sennheiser HD650/Ultrasone PRO 900
Portabelt → Sennheiser Momentum/Sennheiser Urbanite XL/Sennheiser Momentum In-Ear

Trädvy Permalänk
Medlem
Plats
Kristinehamn
Registrerad
Maj 2002

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

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

Trädvy Permalänk
Medlem
Plats
Borlänge
Registrerad
Mar 2005

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

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

Ljud
PC → ODAC → Objective2 → Sennheiser HD650/Ultrasone PRO 900
Portabelt → Sennheiser Momentum/Sennheiser Urbanite XL/Sennheiser Momentum In-Ear

Trädvy Permalänk
Medlem
Plats
Kristinehamn
Registrerad
Maj 2002
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?

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

Trädvy Permalänk
Medlem
Plats
Borlänge
Registrerad
Mar 2005

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.

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

Ljud
PC → ODAC → Objective2 → Sennheiser HD650/Ultrasone PRO 900
Portabelt → Sennheiser Momentum/Sennheiser Urbanite XL/Sennheiser Momentum In-Ear

Trädvy Permalänk
Medlem
Plats
Kristinehamn
Registrerad
Maj 2002
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?

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

Trädvy Permalänk
Medlem
Plats
Borlänge
Registrerad
Mar 2005
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.

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

Ljud
PC → ODAC → Objective2 → Sennheiser HD650/Ultrasone PRO 900
Portabelt → Sennheiser Momentum/Sennheiser Urbanite XL/Sennheiser Momentum In-Ear

Trädvy Permalänk
Medlem
Plats
i din garderob
Registrerad
Sep 2007
Citat:

Ursprungligen inskrivet av Phod
Doh!

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

Bilanaloger är som Volvo — varenda svenne kör med dem