Jump to content
php.lv forumi

Vienādu vērtību skaitīšana


klavsr

Recommended Posts

Sveiki!
 
Ir jāatrod vienādās vērtības tabulā, šajā gadījumā - cik ierakstos sakrīt e-pasta adreses. To daru šādi:

SELECT email, count(email) as times FROM applications group by email having times > 1 

Šajā gadījumā tiek saskaitītas tās vienādās e-pasta adreses, kuras sakrīt 1:1, bet gribu pieskaitīt arī tās, kur vienā vai otrā galā ir atstarpe, vai lieks punkts, vai kas cits.

Respektīvi, saskaitīt tās vērtības, kas sakristu pēc principa:

LIKE '%email%'

Kā būtu jāizskatās kverijam?

Link to comment
Share on other sites

Vienmēr jau nu vajadzētu nenoslinkot un iedot skriptu + piemēra datus.

Bet nu es izdarīju pats, jo piemērs likās interesants.

CREATE TABLE applications (
  id int primary key,
  email varchar(100));

insert into applications values (1, '[email protected] ');
insert into applications values (2, ' [email protected]. ');
insert into applications values (3, '[email protected]');
insert into applications values (4, '[email protected] ');
insert into applications values (5, '[email protected] ');
insert into applications values (6, ' [email protected] ');
insert into applications values (7, ' [email protected].');
insert into applications values (8, '[email protected] ');

Nu tātad LIKE '%email%' īsti neder, jo tad [email protected] būs tas pats, kas [email protected].

 

Tāpēc man šķiet, ka vajadzētu uzrakstīt f-ju, kas katru e-pastu noved līdz nosacītai normālformai, lai tur būtu palicis tikai, tas ko vajag, piemēram:

mysql> select id, trim('.' FROM trim(t1.email)), email
    -> from applications t1;
+----+-------------------------------+--------------+
| id | trim('.' FROM trim(t1.email)) | email        |
+----+-------------------------------+--------------+
|  1 | [email protected]                     | [email protected]    |
|  2 | [email protected]                     |  [email protected].  |
|  3 | [email protected]                     | [email protected]    |
|  4 | [email protected]                     | [email protected]    |
|  5 | [email protected]                       | [email protected]      |
|  6 | [email protected]                       |  [email protected]     |
|  7 | [email protected]                       |  [email protected].    |
|  8 | [email protected]                       | [email protected]      |
+----+-------------------------------+--------------+
8 rows in set (0.00 sec)

Un tad jau tālāk var urbt vai nu ar group by:

mysql> select trim('.' FROM trim(t1.email)), count(*)
    -> from applications t1
    -> group by trim('.' FROM trim(t1.email))
    -> having count(*) > 1;
+-------------------------------+----------+
| trim('.' FROM trim(t1.email)) | count(*) |
+-------------------------------+----------+
| [email protected]                     |        4 |
| [email protected]                       |        3 |
+-------------------------------+----------+
2 rows in set (0.00 sec)

vai arī group_concat:

mysql> select trim('.' FROM trim(t1.email)), group_concat(id)
    -> from applications t1
    -> group by trim('.' FROM trim(t1.email))
    -> having count(*) > 1;
+-------------------------------+------------------+
| trim('.' FROM trim(t1.email)) | group_concat(id) |
+-------------------------------+------------------+
| [email protected]                     | 1,2,3,4          |
| [email protected]                       | 5,6,7            |
+-------------------------------+------------------+
2 rows in set (0.00 sec)

mysql> select trim('.' FROM trim(t1.email)), group_concat(email)
    -> from applications t1
    -> group by trim('.' FROM trim(t1.email))
    -> having count(*) > 1;
+-------------------------------+----------------------------------------------+
| trim('.' FROM trim(t1.email)) | group_concat(email)                          |
+-------------------------------+----------------------------------------------+
| [email protected]                     | [email protected] , [email protected]. ,[email protected],[email protected]  |
| [email protected]                       | [email protected] , [email protected] , [email protected].                 |
+-------------------------------+----------------------------------------------+
2 rows in set (0.00 sec)

Ja neder trimi, tad var meklēt patternu <simbols>@<simbols>.<simbols>, bet cik atceros tad vispārīgā gadījumā e-pasta specifikācija bija nenormāli čakarīgs pasākums un gandrīz katrai regulārajai izteiksmei, kas apraksta e-pastu, var atrast kādu piemēru, kas pēc specifikācijas neder :)

 

Gints Plivna

http://datubazes.wordpress.com

Link to comment
Share on other sites

gribu pieskaitīt arī tās, kur vienā vai otrā galā ir atstarpe, vai lieks punkts, vai kas cits

Pirmām kārtām jau vajadzētu validēt vai vismaz normalizēt e-pastus pirms tie nonāk datubāzē, lai tāda huiņa nemaisītu gaisu. Pašam pēc tam būtu vieglāk.

Ja nu kaut kāda velna pēc tā nevar, tad vismaz izpildi "UPDATE applications SET email = trim('.' FROM trim(t1.email))".

Edited by jurchiks
Link to comment
Share on other sites

jurchik, ne vienmēr ir iespēja kontrolēt kas nonāk db, it īpaši, ja tas ir sākumā domāts kā text input lauks un vēlāk tos datus izdomā izmantot jau kā specifiskus + vēl grūtāk, ja tu pie tā projekta tikai tikko esi piesēdies un sāc lēnām visu optimizēt.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...