Autor | Zpráva | ||
---|---|---|---|
ahoj Profil * |
#1 · Zasláno: 1. 4. 2012, 19:44:51
Inspirován jedním zdejším vláknem, zamyslel jsem se, jak spočítat řádky, splňující podmínku.
Zkusil jsem SELECT COUNT(ID>100) FROM table a čekal jsem, že to spočte řádky s ID>100. Vrací mi to ale počet všech řádků v tabulce. Proč? (neptám se, jak počítat řádky podle kritérií, ptám se, proč COUNT(ID>100) vrací počet všech řádků) |
||
Someone Profil |
---
Přehlédl jsem ahoj: „neptám se, jak počítat řádky“ |
||
Tori Profil |
ahoj:
Cituji manuál: „COUNT(expr) - Returns a count of the number of non-NULL values of expr in the rows retrieved by a SELECT statement.“. Tzn. to co chcete, byste musel zapsat takto: SELECT COUNT(IF(id > 100, id, NULL)) FROM table
|
||
ahoj Profil * |
#4 · Zasláno: 1. 4. 2012, 20:14:25
Tori:
Aha. Takže k nezapočítání řádku nestačí false, ale musí být null. Díky. |
||
Kajman Profil |
#5 · Zasláno: 1. 4. 2012, 20:25:14
Šlo by i
select sum(id>100) (select count(*) ... where id>100) |
||
Tori Profil |
Jinak měla bych doplňující dotaz na zkušenější: Je nějaký rozdíl (uvnitř MySQL) mezi těmito dvěma zápisy, anebo to je jen syntaktická záležitost?
1. SELECT COUNT(IF(id > 100, id, NULL)) FROM table
2. SELECT COUNT(*) FROM table WHERE id > 100
Zkoušela jsem teď explainy, a zdá se, že podmínka uvnitř count se musí provést pro jeden každý řádek tabulky (byť přitom využije index). Stejná podmínka ve WHERE asi neprochází všechny řádky, ale vyřeší se jen přes index. (jestli teda správně interpretuju výsledky) |
||
ahoj Profil * |
#7 · Zasláno: 1. 4. 2012, 20:32:22
Kajman:
„ale myslím, že většinou dopadne rychleji“ Mně šlo o případ, kdy těch countů je víc a nejsou třeba ani samy. Konkrétně mě to napadlo při čtení tohoto. |
||
Kajman Profil |
#8 · Zasláno: 2. 4. 2012, 10:04:35
Tori:
Myslím, že jsi to popsala správně. V prvním případě se pro každý řádek musí vyřešit, zda dělat count nad číslem nebo null hodnotou. V druhém se jen podle indexu zjistí počet id větších než 100. ahoj: Když bude countů víc, o to větší může být rozdíl v rychlosti obou variant. |
||
Časová prodleva: 12 let
|
0