0
votes

Comment sélectionner les lignes ayant plus d'un enregistrement dans une table?

"Sélectionnez les bières qui ont été bu par plus d'une personne". Fondamentalement, j'essaie de récupérer un résultat de requête qui me montre la liste des bières qui ont été bu par plus d'une personne, puis le nom des personnes qui ont bu cette bière. J'ai essayé de faire un groupe et d'avoir une clause, mais j'ai réalisé que je ne pouvais pas avoir de clause de groupe car je suis intéressé par les valeurs en double des colonnes nom et bière. Que dois-je faire?

table bpb

sysnr       beer              name
----------  ----------------  ----------
1260        Guinness Draught  Agneta
11226       Gigantic IPA      Alan
11410       Alesmith Decaden  Alan
11581       Trashy Blonde     Alan
1260        Guinness Draught  Alan
1403        Tuborg            Alan
1416        Lowenbrau         Alan
1506        Jever             Alan
1515        Punk IPA          Alan
1523        Armageddon IPA    Alan
1540        Westmalle Double  Alan
1548        Brooklyn Lager    Alan
1553        Chang Beer        Alan
1559        Coors Light       Alan
1565        Bitburger         Alan
1565        Bitburger         Alan
1566        Pilsner Urquell   Alan
1574        Pabst Blue Ribbo  Alan
1585        San Miguel        Alan
1594        Lapin Kulta       Alan
1625        Sierra Nevada Pa  Alan
1642        Fullers London P  Alan
1649        Samuel Adams Bos  Alan
1650        Orval             Alan
1654        Duvel             Alan
1657        Chimay vit        Alan
1659        Leffe Blond       Alan
1664        Kwak              Alan
1670        DAB               Alan
1670        DAB               Alan
1675        Anchor Steam Bee  Alan
89607       Lagunitas IPA     Alan
89793       Maredsous Tripel  Alan
11410       Alesmith Decaden  Dick
1553        Chang Beer        Dick
1642        Fullers London P  Dick
1222        Sofiero           Dina
1574        Pabst Blue Ribbo  Dina
1650        Orval             Dina
11451       Pripps Bla        Fredrik
1403        Tuborg            Fredrik
1559        Coors Light       Fredrik
30611       Dugges High Five  Fredrik
11489       Gambrinus         Henrik
1353        Budvar            Henrik
1544        Litovel Classic   Henrik
1566        Pilsner Urquell   Henrik
1611        Breznak           Henrik
89301       Bernard           Henrik
11410       Alesmith Decaden  Janne
1260        Guinness Draught  Janne
1506        Jever             Janne
1559        Coors Light       Janne
1559        Coors Light       Janne
1649        Samuel Adams Bos  Janne
11410       Alesmith Decaden  Johan
1515        Punk IPA          Johan
1548        Brooklyn Lager    Johan
1559        Coors Light       Johan
1670        DAB               Johan
1403        Tuborg            Jonas
1403        Tuborg            Juha
1403        Tuborg            Juha
1522        Karhu             Juha
1523        Armageddon IPA    Juha
1566        Pilsner Urquell   Juha
1574        Pabst Blue Ribbo  Juha
1594        Lapin Kulta       Juha
30023       US Red Ale        Juha
30658       Stigbergets Sais  Juha
11433       Falcon Export     Kalle
1519        Saxon             Kalle
1522        Karhu             Kalle
1551        Citra Pale Ale    Kalle
1594        Lapin Kulta       Kalle
1675        Anchor Steam Bee  Kalle
30023       US Red Ale        Kalle
11433       Falcon Export     Kjell
1515        Punk IPA          Kjell
1548        Brooklyn Lager    Kjell
1559        Coors Light       Kjell
11226       Gigantic IPA      Lennart
11451       Pripps Bla        Lennart
11489       Gambrinus         Lennart
11581       Trashy Blonde     Lennart
1344        Amstel            Lennart
1403        Tuborg            Lennart
1407        Backyard Brew     Lennart
1523        Armageddon IPA    Lennart
1540        Westmalle Double  Lennart
1565        Bitburger         Lennart
1566        Pilsner Urquell   Lennart
1574        Pabst Blue Ribbo  Lennart
1594        Lapin Kulta       Lennart
1642        Fullers London P  Lennart
1650        Orval             Lennart
1659        Leffe Blond       Lennart
1664        Kwak              Lennart
1670        DAB               Lennart
89793       Maredsous Tripel  Lennart
1403        Tuborg            Lisen
1407        Backyard Brew     Lisen
1548        Brooklyn Lager    Lisen
1553        Chang Beer        Lisen
1565        Bitburger         Lisen
1594        Lapin Kulta       Lisen
1657        Chimay vit        Lisen
30611       Dugges High Five  Lisen
30658       Stigbergets Sais  Lisen
11410       Alesmith Decaden  Magnus
1260        Guinness Draught  Magnus
1407        Backyard Brew     Maria
11451       Pripps Bla        Marie
11489       Gambrinus         Rikard
1353        Budvar            Rikard
1540        Westmalle Double  Rikard
1544        Litovel Classic   Rikard
1611        Breznak           Rikard
1650        Orval             Rikard
1654        Duvel             Rikard
1657        Chimay vit        Rikard
1659        Leffe Blond       Rikard
1664        Kwak              Rikard
1670        DAB               Rikard
89793       Maredsous Tripel  Rikard
11410       Alesmith Decaden  Urban
1416        Lowenbrau         Urban
1506        Jever             Urban
1565        Bitburger         Urban
1642        Fullers London P  Urban
1670        DAB               Urban


0 commentaires

3 Réponses :


2
votes

Vous avez besoin d'une condition dans la clause HAVING:

select b.* from bpb b
where exists (
    select 1
    from bpb
    where beer = b.beer and name <> b.name
)

Avec le mot-clé DISTINCT dans COUNT (), seuls les noms différents seront comptés.
Si vous voulez aussi le nom alors:

select * from bpb
where beer in (
    select beer
    from bpb
    group by beer
    having count(distinct name) > 1
)

ou avec EXISTS:

select beer
from bpb
group by beer
having count(distinct name) > 1


2 commentaires

Le problème est que cela fonctionnerait si je voulais seulement montrer la colonne de bière, mais dans mon cas, je dois montrer 2 colonnes; la colonne du nom et de la bière, et donc je trouve que le group by est un problème ici?


Travaillé :) a également ajouté une clause de commande hehe



0
votes

Vous pouvez utiliser count distinct avec group by et ayant

select  beer 
from my_table  
group by beer 
having count(distinct name) > 1 


1 commentaires

Cela fonctionnerait si je n'avais besoin que de connaître les noms de bière, mais j'ai également besoin de savoir qui a bu ces bières qui ont été bu par plusieurs personnes, c'est-à-dire 2 colonnes



0
votes

Vous trouverez peut-être pratique d'obtenir tous les noms sur une seule ligne. Je pourrais suggérer:

select beer, group_concat(distinct name)
from bpb
group by beer
having count(distinct name) > 1


3 commentaires

Cette version est très intéressante. Cependant, mon cours est très préoccupé par les règles d'intégrité, la normalisation, etc., donc avoir plusieurs valeurs dans un champ violerait dans mon cas certaines règles pour ainsi dire.


@MrMiyagi. . . Les règles de structuration des données dans la base de données sont très différentes de la manière dont les requêtes renvoient des ensembles de résultats - en fait, dans une base de données normalisée, la plupart des requêtes dénormalisent les données, d'une manière ou d'une autre. Je viens de proposer ceci parce que vous pourriez trouver cela utile.


Je vous ai remercié monsieur, en fait, je conviendrais que cette version a l'air assez pratique pour les yeux