通过分组和聚合来消除记录
P粉731861241
P粉731861241 2023-08-17 19:20:03
0
1
380
<p>我有一个临时表,内容如下:</p> <pre class="brush:php;toolbar:false;">playlist_id | item_id | passed ----------------------------------------- 123 | 111 | true 123 | 111 | false 123 | 111 | true 123 | 112 | true 456 | 212 | false 789 | 212 | true</pre> <p>我需要缩减结果,如果对于一个<code>playlist_id, item_id</code>,只有当所有的<code>passed</code>值都为true时,我才需要保留,所以在这个例子中,我想要的结果是:</p> <pre class="brush:php;toolbar:false;">playlist_id | item_id | passed ----------------------------------------- 123 | 112 | true 789 | 212 | true</pre> <p>因为第二条记录的<code>playlist_id, item_id</code>对有一个<code>false</code>值,所以整个对应组需要被删除。 我尝试使用<code>group by</code>和<code>having</code>,所以查询如下:</p> <pre class="brush:php;toolbar:false;">select playlist, item_id from temp table group by playlist_id, item_id having passed = true</pre> <p>但是这给我返回了所有至少有一个<code>true</code>值的对。</p> <p>我该如何消除所有<code>playlist_id, item_id</code>记录,如果其中任何一个布尔类型的<code>passed</code>字段为false呢?</p> <p>谢谢!</p>
P粉731861241
P粉731861241

全部回复(1)
P粉245003607

您需要在HAVING中使用聚合值。否则,您只是在每个组中测试一个随机行。

使用MIN(passed)来获取每个组中passed的最小值。如果所有值都是true,则为1;如果存在任何false值,则为0

SELECT playlist, item_id
FROM temp_table
GROUP BY playlist, item_id
HAVING MIN(passed) = true
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板