Cel mai bun răspuns
în SQL clauza DISTINCT poate fi utilizată *** înainte de *** lista de selectare, pentru a evita rândurile duplicate în ieșire sau *** în interiorul *** o funcție de agregare, cum ar fi COUNT. În al doilea caz, în special pentru COUNT, efectul este de a lua în considerare repetarea valorilor o singură dată. O soluție este aceea cu concatenarea propusă de Greg Kemnitz, în afară de o mică greșeală și adaptări în funcție de tipurile de coloane și funcțiile șirurilor din diferitele motoare sql
SELECT COUNT (DISTINCT CONCAT (col1, …. , col3)) FROM table;
Soluția ușoară
SELECT COUNT (DISTINCT col1, col2, col3) FROM table;
funcționează cu MySQL, nu funcționează în DB2 și nu știu despre alte motoare, dar nu este SQL standard.
O altă soluție mai complicată, care poate fi mai eficientă dacă operația este frecventă și optimizată în mod adecvat, necesită crearea de o vizualizare
CREATE VIEW vw AS SELECT DISTINCT col1, col2, col3 GROUP BY col1, col2, col3; SELECT COUNT (*) FROM vw;
Răspunde
mysql> creează tabel fals (foo tinyint (3) nu nul implicit 0, bar varchar (64) nu nul implicit „”) ; Interogare OK, 0 rânduri afectate (0,07 sec)
mysql> inserare în valori false (1, „foo”), (1, „bar”), (2, „foo”), (2, „bar”), (3, „baz”), (3, „pentru”); Interogare OK, 6 rânduri afectate (0,00 sec) Înregistrări: 6 Duplicate: 0 Avertismente: 0
mysql> selectați foo, bar, count (*) din grupul fals de foo, bar; + —– + —– + ———- + | foo | bar | count (*) | + —– + —– + ———- + | 1 | bar | 1 | | 1 | foo | 1 | | 2 | bar | 1 | | 2 | foo | 1 | | 3 | baz | 1 | | 3 | pentru | 1 | + —– + —– + ———- + 6 rânduri în set (0,00 sec)
mysql> inserare în valori false (1, „foo „), (1,” bar „), (2,” foo „), (2,” bar „), (3,” baz „), (3,” pentru „); Interogare OK, 6 rânduri afectate (0,00 sec) Înregistrări: 6 Duplicate: 0 Avertismente: 0
mysql> selectați foo, bar, count (*) din grupul fals de foo, bar; + —– + —– + ———- + | foo | bar | count (*) | + —– + —– + ———- + | 1 | bar | 2 | | 1 | foo | 2 | | 2 | bar | 2 | | 2 | foo | 2 | | 3 | baz | 2 | | 3 | pentru | 2 | + —– + —– + ———- + 6 rânduri în set (0,00 sec)
mysql>