webForumDet fria alternativet

Count

10 svar · 314 visningar · startad av Qimen

QimenMedlem sedan juni 20013 568 inlägg
#1

Hej

Har ett par sql frågor som jag hade velat slå ihop. Har suttit en lång stund nu och får det inte att fungera. Jag hade velat få alla frågorna till bara två om det går.

Om det går så ska dessa finnas i första:

SELECT COUNT(*) FROM pw_system WHERE db_reg_online = 1
SELECT COUNT(*) FROM pw_system WHERE db_reg_online = 1 AND db_reg_access = 250
SELECT COUNT(*) FROM pw_system

Och dessa i den andra:

SELECT db_inf_pixlar FROM pw_system WHERE id = 1

SELECT COUNT(*) FROM pw_pm WHERE db_reg_read = 1 AND db_reg_id = 1
SELECT COUNT(*) FROM pw_guest WHERE db_reg_read = 1 AND db_reg_id = 1

Som DBMS kör jag MySql 4.0.17. Försökte med subqueries men det ville sig inte. :)

LarsGMedlem sedan dec. 200012 465 inlägg
#2
SELECT COUNT(*) , 
sum(case when db_reg_online = 1 then 1 else 0 end), 
sum(case when db_reg_online = 1 
         and db_reg_access = 250 then 1 else 0 end)
FROM pw_system

Den andra lämnas som övning till den intresserade läsaren.

QimenMedlem sedan juni 20013 568 inlägg
#3

Tack så mycket! :)

QimenMedlem sedan juni 20013 568 inlägg
#4

Men jag får inte rätt på det om jag har två Counts från två olika tabeller, det kanske inte går då?

LarsGMedlem sedan dec. 200012 465 inlägg
#5

Nu när jag tittar på de andra frågorna så ser jag att det är ett helt annat problem. I och med att det är skilda tabeller och orelaterade frågor så går det inte att få ihop i en fråga.

Den fjärde får ställas enskilt.
De två sista kan man slå ihop med hjälp av union.

SELECT COUNT(*), 'guest' 
   FROM pw_guest 
 WHERE db_reg_read = 1 
AND db_reg_id = 1 
union all 
SELECT COUNT(*),'pm' 
FROM pw_pm 
WHERE db_reg_read = 1 
AND db_reg_id = 1

Notera att den select som innehåller guest måste ligga först. (detta på grund av ett fel i Mysql.)

QimenMedlem sedan juni 20013 568 inlägg
#6

Tack igen!
Har dock lite problem med hur jag ska hämta ut datan från den sista sqln. Resultatet blir ju:

COUNT(*) | guest
------------------
0 	 | guest
1 	 | pm

Hur ska jag då göra för att hämta ut 1:an? Försökte med mysql_fetch_assoc men det ville sig inte.

K@llenMedlem sedan mars 20032 654 inlägg
#7
SELECT COUNT(*) as first, 'guest' 
   FROM pw_guest 
 WHERE db_reg_read = 1 
AND db_reg_id = 1 
union all 
SELECT COUNT(*) as second, 'pm' 
FROM pw_pm 
WHERE db_reg_read = 1 
AND db_reg_id = 1

Du kan ju ge dem alias så som jag gjort ovan. Då får du ut dem med aliasnamnet, tex:

$secondResult = $row['second'];
QimenMedlem sedan juni 20013 568 inlägg
#8

Jag provade det men det enda den gör då är att byter bort COUNT(*) mot first som i ditt fall, second ser man inte alls.

LarsGMedlem sedan dec. 200012 465 inlägg
#9

as second i den andra select-frågan har ingen betydelse. Det är vad som står i den första som styr.

Det går också att använda index

$c = mysql_query($sql);
while ($row = mysql_fetch_row($c)) {
     echo $row[1] . ' = ' . row[0];
}
K@llenMedlem sedan mars 20032 654 inlägg
#10

Aha, man lär så länge man lever. :D

QimenMedlem sedan juni 20013 568 inlägg
#11

Ah föll mig inte in att man kan köra med en whilesats, Tack än en gång Lars! :D

Genererad på 371 ms · cache AV · v20260730165559-full.f96bc7eb