» »

[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

jeti51 ::

select email
from tabela
group by email
having count(email) > 1

Nekaj takega... ? ;)

shorvat ::

Hvala za odgovor.

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

jure1825 ::

in kaj tisto kar je napisal jeti51 ni v redu?

shorvat ::

Tisti SQL izpiše:

janko
simona

enake zapise grupira v en zapis

|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.

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

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.:)

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.
1ACDoHVj3wn7N4EMpGVU4YGLR9HTfkNhTd... in case I've written something useful :)


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Učenje programiranja PHP

Oddelek: Programiranje
91479 (1020) Spura
»

[SQL] PgAdmin preprosto vprasanje povezano s stolpci v tabeli

Oddelek: Programiranje
222193 (1552) Cvele2011
»

MYSQL vprašanje

Oddelek: Programiranje
131786 (1401) MrBrdo
»

SQL poizvedba

Oddelek: Programiranje
152159 (1669) borchi
»

SQL poizvedba z DISTINCT

Oddelek: Programiranje
191903 (1744) zdravc

Več podobnih tem