Jump to content
Fórum Script Brasil
  • 0

Agrupar Registos Pelo Conteudo De Um Determinado Campo


Guest hcardoso

Question

Guest hcardoso

boas

imaginem que tenho uma tabela com o nome de pessoas e o nome da cidade onde vivem:

id - nome - cidade

-------------------------

1 - hugo - porto

2 - telmo - leiria

3 - rui - lisboa

4 - joão - porto

5 - joel - aveiro

6 - pedro - leiria

eu preciso de uma consulta à tabela que me devolva apenas os registos das pessoas que vivem em cidades onde vive mais alguém...

neste caso devolveria:

1 - hugo - porto

4 - joão - porto

2 - telmo - leiria

6 - pedro - leiria

a questão é que isto tem que ser feito sem ser necessário fornecer o nome das cidades no SQL. a consulta tem que fazer a analise sozinha.

alguém me ode ajudar?

desde já agradeço a ajuda.

Link to comment
Share on other sites

9 answers to this question

Recommended Posts

  • 0
Guest Visitante

peço desculpa pela duplicação.

quanto à minha questão...

o post que sugeriste não serve para aquilo que pretendo.

eu preciso que ele devolva os registo que têm cidades repetidas. tem que excluir os registos cujas cidades só aparecem num registo.

brigado pela ajuda

Link to comment
Share on other sites

  • 0

Você quer manter apesar os duplicados e excluir os outros? Então usa subquery...

DELETE FROM tabela WHERE id NOT IN (SELECT id, COUNT(*) reg_dup FROM tabela HAVING reg_dup > 1)

Acho que a sintaxe tá correta... mas a idéia é essa.. apagar todos, com exceção dos que forem duplicados...

Link to comment
Share on other sites

  • 0
Guest hcardoso

boas

eu não quero excluir nenhum registo. quero que todos se mantenham na base de dados, mas a query ne devolva apenas aqueles em que as cidades têm mais que um habitante.

por isso tentei alterar o que sugeriste:

SELECT * FROM xteste WHERE cidade IN (SELECT cidade, COUNT(*) reg_dup FROM xteste HAVING COUNT(*) > 1 ORDER BY cidade ASC)

mas recebi o erro:

Erro na query: SELECT * FROM xteste WHERE cidade IN (SELECT cidade, COUNT(*) reg_dup FROM xteste HAVING COUNT(*) > 1 ORDER BY cidade ASC).Operand should contain 1 column(s)

esto no bom caminho ou nem por isso?

Link to comment
Share on other sites

  • 0

Mas se você quer APENAS OS DUPLICADOS, o caminho foi o que eu falei primeiro...

SELECT *, COUNT(*) reg_dup FROM tabela GROUP BY coluna HAVING reg_dup > 1

Isso retornar APENAS os registros duplicados...

Link to comment
Share on other sites

  • 0
Guest hcardoso

boas

já estou a dar em maluco com isto ;)

com esta linha que sugeres:

SELECT *, COUNT(*) reg_dup FROM xteste GROUP BY cidade HAVING reg_dup > 1

da tabela:

id - nome - cidade

-------------------------

1 - hugo - porto

2 - telmo - leiria

3 - rui - lisboa

4 - joão - porto

5 - joel - aveiro

6 - pedro - leiria

apenas me são devolvidos os registos:

2 - telmo - leiria

1 - hugo - porto

e eu preciso que apresente:

1 - hugo - porto

4 - joão - porto

2 - telmo - leiria

6 - pedro - leiria

penso que o "group by" está a impedir que sejam apresentados todos os registos

Link to comment
Share on other sites

  • 0
Guest hcardoso
Sim... o GROUP BY "agrupa" todos os ítens duplicados... remove ele e coloca em um laço para exibir tudo...

boas

desculpa a minha ignorancia, mas o que é um laço?

obrigado pela paciencia

Link to comment
Share on other sites

  • 0

Laço é o que se usa para pegar todos os registros retornados de um query... isso leva outros nomes, dependendo da linguagem de programação que você estiver usando... mas como você já conseguiu resgatar os dados (no caso com a query com group by), então ignore o meu comentário...

Link to comment
Share on other sites

Guest
This topic is now closed to further replies.


  • Forum Statistics

    • Total Topics
      152k
    • Total Posts
      651.5k
×
×
  • Create New...