Kod berikut mengira bilangan permainan yang dimainkan, dimenangi dan kalah oleh setiap pemain. Walau bagaimanapun, panjang dan kerumitannya menimbulkan cabaran. Bagaimanakah kita boleh memudahkan pertanyaan ini?
Gunakan klausa FILTER
untuk menapis pengagregatan berdasarkan ungkapan Boolean:
<code class="language-sql">SELECT u.name, COUNT(*) FILTER (WHERE g.winner_id > 0) AS played, COUNT(*) FILTER (WHERE g.winner_id = u.id) AS won, COUNT(*) FILTER (WHERE g.winner_id <> u.id) AS lost FROM games g JOIN users u ON u.id IN (g.player_1_id, g.player_2_id) GROUP BY u.name;</code>
Penekanan PostgreSQL 9.4 memperkenalkan klausa FILTER
. Untuk versi lama, penyelesaian wujud:
<code class="language-sql">SELECT u.name, COUNT(CASE WHEN g.winner_id > 0 THEN 1 END) AS played, COUNT(CASE WHEN g.winner_id = u.id THEN 1 END) AS won, COUNT(CASE WHEN g.winner_id <> u.id THEN 1 END) AS lost FROM games g JOIN users u ON u.id IN (g.player_1_id, g.player_2_id) GROUP BY u.name;</code>
Nota: Penyelesaian untuk versi lama PostgreSQL menggunakan pernyataan CASE
dan bukannya klausa FILTER
untuk mencapai kesan yang sama. Kedua-dua kaedah mengira statistik permainan pemain dengan tepat, tetapi klausa FILTER
mempunyai kelebihan kerana lebih mudah dibaca dan diselenggara.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Memudahkan Mengagregat Statistik Permainan dengan Penapis Berbeza dalam PostgreSQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!