我需要构建一个相当复杂的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
的行组。这是条件:
page_views
大于0。step
大于2。如果上述两个条件中的任何一个失败,整个组都不会被退回。所以这里应该返回什么:
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
在那之后,我不太确定。
任何帮助都将不胜感激。
答案 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