2016-07-21 3 views
0

У меня довольно сложный SQL-запрос, который мне нужно создать. Прости меня, я не волшебный волшебник с SQL.Сложная группировка в SQL-запросе

Вот мои две таблицы (значительно упрощены):

TABLEA

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.

Если какая-либо из два вышеуказанных условия не работают, вся группа не будет возвращена. Итак, вот что должно быть возвращено:

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» (или Джейкоб Кларк) не было ни одной строки, где page_views больше 0, и ни одна из строк не имеют step больше 2. То же самое с группа «4» (или Алекс Смит).

Так вот в чем проблема. Мне нужен один SQL-запрос, который будет обрабатывать все это. Первое соединение может быть подзапросом, без проблем:

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

После этого я не уверен.

Любая помощь будет оценена по достоинству.

+0

Предложения 'join' могут быть такими же сложными и простыми, как вы хотите. 'join 1' является полностью действительным и просто объединяет ВСЕ записи. это действительно сводится к тому, что предложение join возвращает логическое значение true (присоединяется к рассматриваемым записям) или false (исключая записи). что это выражение, полностью зависит от вас. –

ответ

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 
) 
; 

В моем опыте, первая версия, как правило, быстрее.

+0

Я пробовал первый, который работает, спасибо! –

1

Вы можете сделать это с помощью WHERE NOT EXISTS:

Select A.id, A.request_id, A.page_views, A.step, 
     B.name, B.phone 
From TableA A 
Join TableB B On A.request_id = B.Id 
Where Not Exists 
(
    Select * 
    From TableA A2 
    Where A2.request_Id = A.request_id 
    And  (A2.page_views > 0 Or A2.step > 2) 
) 
Смежные вопросы