"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
3 Réponses :
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
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
Vous pouvez utiliser count distinct avec group by et ayant
select beer from my_table group by beer having count(distinct name) > 1
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
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
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