Éliminer les enregistrements par regroupement et agrégation
P粉731861241
2023-08-17 19:20:03
<p>J'ai une table temporaire avec le contenu suivant : </p>
<pre class="brush:php;toolbar:false;">playlist_id | item_id |
---------------------------------------------
123 | 111 | vrai
123 | 111 | faux
123 | 111 | vrai
123 | 112 | vrai
456 | 212 | faux
789 | 212 | vrai</pré>
<p>Je dois réduire les résultats. Si pour un <code>playlist_id, item_id</code>, je n'ai besoin de le conserver que si toutes les valeurs <code>passed</code> donc dans Dans cet exemple, le résultat que je souhaite est : </p>
<pre class="brush:php;toolbar:false;">playlist_id | item_id |
---------------------------------------------
123 | 112 | vrai
789 | 212 | vrai</pré>
<p>Étant donné que la paire <code>playlist_id, item_id</code> du deuxième enregistrement a une valeur <code>false</code>, l'ensemble du groupe correspondant doit être supprimé.
J'ai essayé d'utiliser <code>group by</code> et <code>having</code>, donc la requête est : </p>
<pre class="brush:php;toolbar:false;">sélectionner
playlist,
ID de l'article
depuis
table temporaire
par groupe
playlist_id,
ID de l'article
ayant réussi = true</pre>
<p>Mais cela me renvoie toutes les paires qui ont au moins une valeur <code>true</code> </p>
<p>Comment puis-je éliminer tous les enregistrements <code>playlist_id, item_id</code> si l'un d'entre eux a un champ booléen <code>passed</code> </p>
<p>Merci ! </p>
Vous devez utiliser des valeurs globales dans
HAVING
. Sinon, vous testez simplement une ligne aléatoire dans chaque groupe.Utilisez
MIN(passed)
来获取每个组中passed
的最小值。如果所有值都是true
,则为1
;如果存在任何false
值,则为0
.