SQL查询中的复杂分组

时间:2016-07-21 21:35:34

标签: mysql sql join

我需要构建一个相当复杂的SQL查询。原谅我,我不是一个带SQL的神奇巫师。

这是我的两张桌子(显着简化):

表A

id   request_id   page_views   step
-----------------------------------
 1   1            0            0
 2   1            0            1
 3   1            0            2
 4   1            0            3
 5   2            0            0
 6   2            0            1
 7   2            1            2
 8   3            0            0
 9   3            0            1
10   4            0            0
11   4            0            1
12   4            0            2

tableB的

id   name         phone       
------------------------------
1    John Deere   111-222-3333
2    Sally Sue    333-222-1111
3    Jacob Clark  434-343-4343
4    Alex Smith   222-112-2112

首先,需要在tableA.request_id = tableB.id导致的表格上加入:

id   request_id   page_views   step   name          phone
----------------------------------------------------------------
 1   1            0            0      John Deere   111-222-3333
 2   1            0            1      John Deere   111-222-3333
 3   1            0            2      John Deere   111-222-3333
 4   1            0            3      John Deere   111-222-3333
 5   2            0            0      Sally Sue    333-222-1111
 6   2            0            1      Sally Sue    333-222-1111
 7   2            1            2      Sally Sue    333-222-1111
 8   3            0            0      Jacob Clark  434-343-4343
 9   3            0            1      Jacob Clark  434-343-4343
10   4            0            0      Alex Smith   222-112-2112
11   4            0            1      Alex Smith   222-112-2112
12   4            0            2      Alex Smith   222-112-2112

从该表中,如果符合以下条件,我希望返回组。按组,我的意思是具有相同request_id的行组。这是条件:

  1. 组中的行中没有page_views大于0。
  2. 组中的行中没有step大于2。
  3. 如果上述两个条件中的任何一个失败,整个组都不会被退回。所以这里应该返回什么:

    id   request_id   page_views   step   name          phone
    ----------------------------------------------------------------
    8    3            0            0      Jacob Clark   434-343-434
    9    3            0            1      Jacob Clark   434-343-434
    10   4            0            0      Alex Smith    222-112-2112
    11   4            0            1      Alex Smith    222-112-2112
    12   4            0            2      Alex Smith    222-112-2112
    

    " 3" group(或Jacob Clark)没有page_views大于0的行,且没有行step大于2.与" 4&#34相同;小组(或亚历克斯史密斯)。

    这就是问题所在。我需要一个能够处理所有这些问题的SQL查询。第一个连接可以是子查询,没问题:

    SELECT sub.*
    FROM (
        SELECT tableA.*, tableB.name, tableB.phone
        FROM `tableA`, `tableB`
        WHERE tableA.`request_id` = tableB.id
    ) sub
    

    在那之后,我不太确定。

    任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:2)

您需要在子查询中单独计算最大视图和步骤(通过request_id),然后使用具有足够小的最大值的request_id'

SELECT a.*, b.name, b.phone
FROM (
   SELECT request_id
   FROM tableA
   GROUP BY request_id
   HAVING MAX(page_views) <= 0 AND MAX(step) <= 2
) AS sumQ
INNER JOIN tableA AS a ON sumQ.request_id = a.request_id
INNER JOIN tableB AS b ON a.request_id = b.id
;

或者,或者:

SELECT a.*, b.name, b.phone
FROM tableA AS a
INNER JOIN tableB AS b ON a.request_id = b.id
WHERE a.request_id IN (
     SELECT request_id
     FROM tableA
     GROUP BY request_id
     HAVING MAX(page_views) <= 0 AND MAX(step) <= 2
  )
;

根据我的经验,第一个版本通常更快。

答案 1 :(得分:1)

您可以使用ID ---- Code 1 ---- 28179 2 ---- 49172 3 ---- 40180 4 ---- 36228 5 ---- 29337

执行此操作
WHERE NOT EXISTS