Vinnaren i pepparkakshustävlingen!
  • 1
  • 2
2008-09-12, 15:40
  #1
Medlem
xintrons avatar
Jag har en tabell som ser ut som följer (MySQL):
Kod:
INT   INT    INT
id    type   status

Värden (hoppas folk förstår):
1 2 0
2 2 1
3 2 1

Kan jag få count på type på både status 1 och 0 i samma query, eller behöver jag köra två? Alltså,
Kod:
SELECT COUNT(type) WHERE status = 0
SELECT COUNT(type) WHERE status = 1

Går det att få dessa två queries som en enda eller krävs det två?
Citera
2008-09-12, 15:52
  #2
Medlem
Spejnars avatar
SELECT count(type) FROM minTabell WHERE status = 0 OR status = 1

Du menar så? Borde funka..
Citera
2008-09-12, 15:57
  #3
Medlem
xintrons avatar
Spejnar, nej då kan man ju lika gärna köra utan "WHERE"-satsen. Vill ha två outputs, nämligen count på type när status är 1 och count på "type" när status är 0. Alltså så som mina två queries fungerar, men undrar om det finns möjlighet att optimera detta då det känns onödigt att köra två queries för en sån enkel sak.
Citera
2008-09-12, 18:56
  #4
Medlem
googlevistas avatar
Jag kanske missförstår men...
Kod:
SELECT status, COUNT(type) 
FROM dintabell
GROUP BY status

Eller kanske
Kod:
SELECT SUM(case when status = 0 then 1 else 0 end) as Count_Status0, 
SUM(case when status = 1 then 1 else 0 end) as Count_Status1
__________________
Senast redigerad av googlevista 2008-09-12 kl. 19:01.
Citera
2008-09-12, 19:06
  #5
Medlem
xintrons avatar
Citat:
Ursprungligen postat av googlevista
Jag kanske missförstår men...
Kod:
SELECT status, COUNT(type) 
FROM dintabell
GROUP BY status

Eller kanske
Kod:
SELECT SUM(case when status = 0 then 1 else 0 end) as Count_Status0, 
SUM(case when status = 1 then 1 else 0 end) as Count_Status1

Det är i PHP jag vill ha två variabler, en med count på status = 1 och den andra med count på status = 0, type
Kod:
list($status0$status1) = mysql_feth_rows(mysql_query("...")); 
Citera
2008-09-12, 19:12
  #6
Medlem
googlevistas avatar
Citat:
Ursprungligen postat av xintron
Det är i PHP jag vill ha två variabler, en med count på status = 1 och den andra med count på status = 0, type
Kod:
list($status0$status1) = mysql_feth_rows(mysql_query("...")); 

OK. PHP kan jag inte hjälpa dig med, men alternativ två jag postade ger dig en post med två kolumner, med count på status = 0 och status = 1.
Citera
2008-09-12, 21:19
  #7
Medlem
Rospiggs avatar
SELECT COUNT(type) WHERE status = 0 UNION SELECT COUNT(type) WHERE status = 1

ger:

COUNT(type)
------------
1
2
Citera
2008-09-13, 10:43
  #8
Medlem
xintrons avatar
Citat:
Ursprungligen postat av Rospigg
SELECT COUNT(type) WHERE status = 0 UNION SELECT COUNT(type) WHERE status = 1

ger:

COUNT(type)
------------
1
2

Oh, det är nog vad jag letar efter Jag gissar att det är mer optimerat och mindre krävande av servern än att köra två satser, eller?
Citera
2008-09-13, 14:28
  #9
Medlem
googlevistas avatar
Citat:
Ursprungligen postat av Rospigg
SELECT COUNT(type) WHERE status = 0 UNION SELECT COUNT(type) WHERE status = 1

ger:

COUNT(type)
------------
1
2

Det är ju jävligt nödvändigt att köra en union? Om det nu är det där du ska ha ut, så ska det se ut så här:
Kod:
SELECT     COUNT(type) as Antal
FROM         dintabell
WHERE     
(status 0) OR (status 1)
GROUP BY status 
Ger:
Kod:
Antal
-----
1
2
Sen kan man ju undra vad det är för mening att plocka ut en count utan att plocka ut statusen som count:en gäller för.
Kod:
SELECT     statusCOUNT(type) as Antal
FROM         dintabell
WHERE     
(status 0) OR (status 1)
GROUP BY status 
Ger:
Kod:
status    Antal
--------------
0          1
1          2

Sen, om jag fattar din PHP-kod korrekt, så funkar ovanstående i alla fall inte, för att du vill returnera båda count:en på samma rad. Vilket för oss tillbaks till det andra alternativet jag postade ovan:
Kod:
SELECT     SUM(CASE WHEN status 0 THEN 1 ELSE 0 END) AS Count_Status_0
SUM(CASE WHEN status 1 THEN 1 ELSE 0 END) AS Count_Status_1
FROM         dintabell
WHERE     
(status 0) OR (status 1
Vilket ger:
Kod:
Count_Status_0    Count_Status_1
---------------------------------
1                  2

Och då bör du kunna köra:
Kod:
list($status0$status1) = mysql_feth_row(mysql_query("SELECT SUM(CASE WHEN status = 0 THEN 1 ELSE 0 END) AS Count_Status_0, SUM(CASE WHEN status = 1 THEN 1 ELSE 0 END) AS Count_Status_1 FROM dintabell WHERE     (status = 0) OR (status = 1)")); 
Citera
2008-09-14, 18:41
  #10
Medlem
xintrons avatar
Edit: Fick det att fungera, tackar!

Btw, är koden mer optimerad än om man kör två queries?
__________________
Senast redigerad av xintron 2008-09-14 kl. 19:24.
Citera
2008-09-16, 12:11
  #11
Medlem
googlevistas avatar
Citat:
Ursprungligen postat av xintron
Edit: Fick det att fungera, tackar!

Btw, är koden mer optimerad än om man kör två queries?

Det är generellt bäst att göra så få databasanrop som möjligt. Om du kör två queries måste du ju "koppla upp" mot SQL-servern, köra frågan, och returnera resultatet till PHP två gånger, medans om du gör allt du ska i en fråga så sker detta bara en gång istället. Ju färre "roundtrips" till SQL-servern desto bättre.
Citera
2008-09-16, 18:31
  #12
Medlem
Rospiggs avatar
Citat:
Ursprungligen postat av googlevista
Det är ju jävligt nödvändigt att köra en union?
Absolut. Jag borde ha gått och lagt mig istället för att försöka tänka.
Citera
  • 1
  • 2

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback