如果所有字段结果都为真,则分组

时间:2019-05-05 01:09:25

标签: sql group-by

我有这个查询:

SELECT
    tbl_ord.ord.table,
    tbl_ord.ord.n_ord,
    player.confirm
FROM 
    tbl_ord
INNER JOIN 
    tbl_players ON tbl_ord.player_id = tbl_players.player_ids
WHERE 
    id_shop = 3
ORDER BY 
    n_ord ASC

结果:

+-----------+-------+---------+
| ord_table | n_ord | confirm |
+-----------+-------+---------+
|        10 |     2 |       1 |
|        10 |     2 |       0 |
|         8 |     3 |       1 |
|         8 |     3 |       1 |
|         4 |     5 |       1 |
|         4 |     5 |       1 |
+-----------+-------+---------+

我想在ord_table上按分组方式仅对所有已确认的用户显示结果

+-----------+-------+---------+
| ord_table | n_ord | confirm |
+-----------+-------+---------+
|         4 |     5 |       1 |
|         8 |     3 |       1 |
+-----------+-------+---------+

谢谢!

2 个答案:

答案 0 :(得分:0)

使用HAVING

SELECT
  tbl_ord.ord.table,
  tbl_ord.ord.n_ord,
  MIN(player.confirm)
FROM tbl_ord
INNER JOIN tbl_players ON tbl_ord.player_id = tbl_players.player_ids
WHERE id_shop = 3
GROUP BY tbl_ord.ord.table, tbl_ord.ord.n_ord,
HAVING MIN(player.confirm) = 1
ORDER BY n_ord ASC

答案 1 :(得分:0)

您可能可以使用not exists

SELECT o.ord_table, o.ord.n_ord,
       1 as confirm
FROM tbl_ord o
WHERE NOT EXISTS (SELECT 1
                  FROM tbl_players p 
                  WHERE o.player_id = p.player_ids AND
                        ?.id_shop = 3 AND  -- not sure what table this comes from
                        p.confirm = 0
                 )   
ORDER BY o.n_ord ASC;

这种方法的优点是它避免了在外部层次上的聚集。反过来,这意味着它可以更好地利用索引,包括使用索引可能避免排序。