webForumDet fria alternativet

SUM från flera tabeller

3 svar · 274 visningar · startad av Jetboy

JetboyMedlem sedan aug. 200133 inlägg
#1

Jag har problem med ett sql-kommando:

SELECT us_id, us_checked, us_approved, 
	SUM(IF(mo_checked = 0, 1, 0)) AS mo_pending, 
	SUM(IF(mo_checked = 1 && mo_approved = 0, 1, 0)) AS mo_refused, 
	SUM(IF(mo_checked = 1 && mo_approved = 1, 1, 0)) AS mo_totalApproved, 
	SUM(IF(pi_checked = 0, 1, 0)) AS pi_pending, 
	SUM(IF(pi_checked = 1 && pi_approved = 0, 1, 0)) AS pi_refused, 
	SUM(IF(pi_checked = 1 && pi_approved = 1, 1, 0)) AS pi_totalApproved 
FROM tbl_users 
LEFT JOIN tbl_moments ON (us_id = mo_userId) 
LEFT JOIN tbl_pictures ON (us_id = pi_userId) 
WHERE us_id = " . $intUserId . "
GROUP BY us_id";

If-satserna kollar ett visst villkor och returnerar 1 för sant och 0 för falskt för varje post i tabellerna tbl_moments och tbl_pictures. Resultatet summeras i ett eget fält i det resulterande recordsettet. Problemet är att SUM-funktionerna inte räknar riktigt som jag vill. Värdena från första tabellen räknas rätt och mo_pending, mo_refused och mo_totalApproved får helt rätt värden. Värdena från den andra tabellen blir helt fel; pi_pending innehåller summan av de tre mo-värdena, och de andra pi-värdena blir noll.

Kan jag få SUM-funktionerna för pi-värdena att fungera som de gör för mo-värdena, eller måste jag göra två queries för att få detta att fungera? Tips mottages med stor tacksamhet.

/a

LarsGMedlem sedan dec. 200012 464 inlägg
#2

Det beror väl på att du har en left join och att det inte finns några matchande poster i pictures? Om det är så så är pi_checked och pi_approved null och if blir alltid falskt.

JetboyMedlem sedan aug. 200133 inlägg
#3

Men det är ju det som är poängen. IF-satsen blir falsk och returnerar därmed 0, SUM-funktionen räknar alltså ihop antalet där IF är sant (och returnerar 1). Eftersom pi_checked och pi_approved är null borde IF returnera 0 och SUM, som summerar en massa nollor, borde bli 0 och inte ta värdet från en annan kolumn. Eller?

/Anders

LarsGMedlem sedan dec. 200012 464 inlägg
#4

Jag läste lite slarvigt. Du får göra två frågor (som du kan slå ihop med en union all om du har mysql 4.0 eller senare.)

129 ms totalt · 3 externa anrop · v20260731065814-full.86db40fa
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
127 ms — hämta tråd, inlägg och bilagor (db)