Forum » Programiranje » [MySql] obratno od DISTINCT
[MySql] obratno od DISTINCT
shorvat ::
Lep pozdrav,
imam tabelo, kjer so vpisani e-mail naslovi. Rad bi, da preko SQL stavka dobim samo tiste maile, ki so duplirani oz. so vpisani več kot enkrat.
lp, sašo
imam tabelo, kjer so vpisani e-mail naslovi. Rad bi, da preko SQL stavka dobim samo tiste maile, ki so duplirani oz. so vpisani več kot enkrat.
lp, sašo
shorvat ::
Sem sprobal, pa rabim malo drugačni izpis
PRIMER (tabela):
---------------------------
id | ime
--------------------------
1 | janko
2 | simona
3 | janko
4 | saso
5 | simona
6 | marko
7 | simona
-----------------------------
rabim izpisane vse vpise, ki so vpisani večkrat. Se pravi, iz zgornje tabele je treba izločiti samo edinstvene zapise (ime).
izpis
1 janko
2 simona
3 janko
5 simona
7 simona
lp, sašo
PRIMER (tabela):
---------------------------
id | ime
--------------------------
1 | janko
2 | simona
3 | janko
4 | saso
5 | simona
6 | marko
7 | simona
-----------------------------
rabim izpisane vse vpise, ki so vpisani večkrat. Se pravi, iz zgornje tabele je treba izločiti samo edinstvene zapise (ime).
izpis
1 janko
2 simona
3 janko
5 simona
7 simona
lp, sašo
|SNap| ::
Da on noče, da so vrstice, ki se pojavijo večkrat, izpisane samo enkrat. Po moje...
Ce mas mysql 5 lahko s subquerijem resis zadevo.
Ce mas mysql 5 lahko s subquerijem resis zadevo.
shorvat ::
nimam mysql 5, sem rešil zadevo z dvema SQL stavkoma. Me pa še vseeno zanima, če je možno v starem mysql-u to rešiti z enim stavkom.
jure1825 ::
dobor, važno da si rešu. Mogoče bi se dalo kej z joinom ene in iste tabele naredit..
SELECT A.id, B.id, A.email
FROM tabela A
INNER JOIN tabela B ON ( A.email = B.email )
WHERE A.id < B.id
SELECT A.id, B.id, A.email
FROM tabela A
INNER JOIN tabela B ON ( A.email = B.email )
WHERE A.id < B.id
Zgodovina sprememb…
- spremenilo: jure1825 ()
jeti51 ::
A MINUS MySql prebavi?
(select vse)
MINUS
(select tiste, ki se pojavljajo natanko enkrat)
Sicer pa MySql (iz glave) od verzije 4.1 podpira tudi subqueryje, operator MINUS pa lahko vedno preurediš v neke subqueryje s pomočjo neke "NOT EXISTS" telovadbe.
Sicer pa lahko narediš tudi takole:
SELECT ime
FROM tabela
WHERE email IN ("ena poizvedba z GROUP BY, kjer izbereš tiste emaile, ki se pojavijo več kot enkrat")
Pa še kakšna možnost bi se našla... variacij je kar nekaj, z EXPLAIN pa preveri, katera poizvedba je najhitrejša in potem tisto uporabiš. Idej v tej temi si že dobil kar nekaj.
(select vse)
MINUS
(select tiste, ki se pojavljajo natanko enkrat)
Sicer pa MySql (iz glave) od verzije 4.1 podpira tudi subqueryje, operator MINUS pa lahko vedno preurediš v neke subqueryje s pomočjo neke "NOT EXISTS" telovadbe.
Sicer pa lahko narediš tudi takole:
SELECT ime
FROM tabela
WHERE email IN ("ena poizvedba z GROUP BY, kjer izbereš tiste emaile, ki se pojavijo več kot enkrat")
Pa še kakšna možnost bi se našla... variacij je kar nekaj, z EXPLAIN pa preveri, katera poizvedba je najhitrejša in potem tisto uporabiš. Idej v tej temi si že dobil kar nekaj.
Zgodovina sprememb…
- spremenil: jeti51 ()
frudi ::
ne uporabljat IN operatorja, če za njegov parameter vzameš dinamičen set podatkov. ni problema, če se v IN pojavi par vrednosti (reda 10), če pa gre število elementov proti 100 in več, pa hitrost začne trpeti.
v takih primerih je tipično boljše uporabljat EXISTS, recimo:
SELECT id, ime
FROM tabela
WHERE EXISTS
(
SELECT null
FROM tabela AS t
WHERE tabela.ime = t.ime
GROUP BY ime
HAVING COUNT(ime) > 1
)
drug primer, ki je lahko počasnejši (odvisno od indexov), ampak tipično še vedno hitrejši od IN, je inner join s subselectom:
SELECT id, ime
FROM tabela INNER JOIN
(
SELECT ime, COUNT(id) AS stevilo
FROM tabela
GROUP BY ime
HAVING COUNT(id) > 1
) AS X ON tabela.ime = X.ime
P.S. ne poznam MySql, tako da ne poznam njegovih zmožnosti in točne sintakse. tole je za primer MS SQL, ampak ustrezni ekvivalent verjetno obstaja tudi v MySql.
v takih primerih je tipično boljše uporabljat EXISTS, recimo:
SELECT id, ime
FROM tabela
WHERE EXISTS
(
SELECT null
FROM tabela AS t
WHERE tabela.ime = t.ime
GROUP BY ime
HAVING COUNT(ime) > 1
)
drug primer, ki je lahko počasnejši (odvisno od indexov), ampak tipično še vedno hitrejši od IN, je inner join s subselectom:
SELECT id, ime
FROM tabela INNER JOIN
(
SELECT ime, COUNT(id) AS stevilo
FROM tabela
GROUP BY ime
HAVING COUNT(id) > 1
) AS X ON tabela.ime = X.ime
P.S. ne poznam MySql, tako da ne poznam njegovih zmožnosti in točne sintakse. tole je za primer MS SQL, ampak ustrezni ekvivalent verjetno obstaja tudi v MySql.
1ACDoHVj3wn7N4EMpGVU4YGLR9HTfkNhTd... in case I've written something useful :)
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | Učenje programiranja PHPOddelek: Programiranje | 1479 (1020) | Spura |
» | [SQL] PgAdmin preprosto vprasanje povezano s stolpci v tabeliOddelek: Programiranje | 2193 (1552) | Cvele2011 |
» | MYSQL vprašanjeOddelek: Programiranje | 1786 (1401) | MrBrdo |
» | SQL poizvedbaOddelek: Programiranje | 2159 (1669) | borchi |
» | SQL poizvedba z DISTINCTOddelek: Programiranje | 1903 (1744) | zdravc |