2014-11-29 1 views
2

Я ищу для запроса MySQL для извлечения значения, как в следующем примере:Выбор строк из таблицы на основе максимального значения в другой таблице

TABLE1: 
ID  name 
25  ab  
24  abc  
23  abcd  
22  abcde  
21  abcdef 


TABLE2: 
ID  ID_TABLE1 total  
1  25   0 
2  25   1 
3  25   2 
4  25   3 
5  23   1 
6  22   0 
7  22   1 
8  21   0 
9  21   2 
10  24   10 
11  24   7 

Я хочу, чтобы вернуть все TABLE1 строки, где максимальное значение total колонка (в TABLE2) является < 3. Таким образом, результаты должны быть:

ID  name 
23  abcd  
22  abcde  
21  abcdef 

Я попытался это:

SELECT t1.* 
FROM TABLE1 t1 
INNER JOIN (
     SELECT MAX(total) AS max_total, ID_TABLE1 
     FROM TABLE2 
     GROUP BY total, ID_TABLE1 
) t2 
ON t1.ID = t2.ID_TABLE1 
WHERE t2.max_total < 3 

но это не тот результат, который я хочу.

ответ

2

Ваши внутренние группы запросов результаты по id_tableи по общей. Так как максимум total за total - это значение, оно делает внутренний запрос несколько бессмысленным. Просто удалите total из пункта group by и вы должны быть в порядке:.

SELECT t1.* 
FROM TABLE1 t1 
INNER JOIN (
     SELECT MAX(total) AS max_total, ID_TABLE1 
     FROM  TABLE2 
     GROUP BY ID_TABLE1 
) t2 
ON t1.ID = t2.ID_TABLE1 
WHERE t2.max_total < 3 
3

Попробуйте это:

SELECT t1.ID, t1.name 
FROM TABLE1 t1 
INNER JOIN (SELECT ID_TABLE1, MAX(total) AS max_total 
      FROM TABLE2 
      GROUP BY ID_TABLE1 
     ) t2 ON t1.ID = t2.ID_TABLE1 
WHERE t2.max_total < 3; 
0

ВЫБРАТЬ t1 *

ОТ table1 t1

INNER JOIN (

SELECT MAX(total) AS max_total, ID_TABLE1 
    FROM TABLE2 
    where total > 3 GROUP BY total, ID_TABLE1 

) t2 ON t1.ID! = t2.ID_TABLE1

1
SELECT t1.* 
FROM TABLE1 t1 
INNER JOIN (
    SELECT MAX(total) AS max_total, ID_TABLE1 
    FROM  TABLE2 
    GROUP BY ID_TABLE1 
    having t2.max_total < 3 
) t2 
ON t1.ID = t2.ID_TABLE1 
1

Вот как это сделать, используя left join без использования каких-либо подзапросов и групповых предложений.

select t1.* from table1 t1 
join table2 t2 
on t1.id = t2.id_table1 
left join table2 t3 on 
t2.id_table1 = t3.id_table1 
and t2.total < t3.total 
where t3.id is null 
and t2.total < 3 

Другой способ

select t1.* from table1 t1 
join table2 t2 on t1.id = t2.id_table1 
where not exists(
    select 1 from table2 t3 
    where t2.id_table1 = t3.id_table1 
    and t2.total < t3.total 
) 
and t2.total < 3; 
0

Там более простой способ без использования GROUP или MAX:

SELECT * FROM table1 
WHERE id NOT IN (
    SELECT id_table1 FROM table2 WHERE total >= 3 
); 

подзапрос выбирает все строки в table2, которые имеют общую> = 3. Тогда мы выбираем эти строки из table1, которые не входят в результат подзапроса.

Смежные вопросы