2017-01-30 6 views
0

У меня есть запрос, который я хотел бы запустить, но для нескольких идентификаторов в списке. Ниже приведен пример кода:Итерация по списку с помощью SQL

`SELECT avg(t1.Percentage) 
    FROM 
    (
    SELECT 
     checkins.id_user as userID, 
     count(checkins.id_check_in) as Aantal, 
(SELECT COUNT(events.id_event) 
      FROM 
      events 
      WHERE events.id_event_group = 146 
      AND `start` > '2014-01-01 00:00:00') as AantalEvents, 
count(checkins.id_check_in)/(SELECT COUNT(events.id_event) 
      FROM 
      events 
      WHERE events.id_event_group = 146 
      AND `start` > '2014-01-01 00:00:00') as Percentage 
    FROM 
checkins 
    LEFT JOIN events ON 
events.id_event = checkins.id_event 
    WHERE checkins.id_user IN(
     SELECT checkins.id_user as userID 
     FROM checkins 
     WHERE id_event = **26276**) # < This is the ID that I want to change through a list) 
      AND events.id_event_group = 146 
      GROUP BY checkins.id_user)t1 ;` 

Я выделил идентификатор, который я хочу изменить на основе списка, который я определяю с другим запросом (список идентификаторов). Возможно ли это с помощью SQL? Я использую DBeaver как инструмент.

+0

Что база данных? Это может быть SQL Server или MySQL, а не оба. –

+0

Извините, это MySQL. –

ответ

1

SQL работает по принципу «наборы». Это означает, что при выполнении функций в вашем операторе select это делается для всех строк, возвращаемых этим оператором.

Это означает, что если вы просто указали список значений для фильтрации вашего запроса с помощью оператора in или производной таблицы, вы вернете соответствующие значения для каждой строки из этого списка.

Если у вас есть статический список id_event значений, которые вы можете сделать:

where id_event in(1,2,3,4,etc) 

и если они находятся в таблице, которые вы хотите применить набор фильтров, чтобы получить список событий, вы можете просто добавьте inner join к вашему запросу:

select Columns 
from OtherTables 
    inner join checkins 
     on <join condition 1> 
      and <join condition 2> 
      and <checkin filter 1> 
      and <checkin filter 2> 

Изменить, чтобы добавить после осветления

агрегаты SQL работают по группам данных. Что-то вроде следующего будет агрегировать весь набор данных, который возвращается, как не группирования применяется:

select sum(Col) as Total 
from Table 

Принимая во внимание то, что, как это даст вам общее для каждого ID значения:

select ID 
     ,sum(Col) as Total 
from Table 
group by ID 
+0

Я понимаю это, возможно, неправильно сформулировал мой вопрос. Конечный результат или расчет необходимы для каждого id_event отдельно. Если я использую IN, он добавит все события вместе. Имеет ли это смысл? –

+0

Вы можете добавить свой 'id_event' в список' select' и 'group by', чтобы получить агрегированные результаты по каждому значению' id_event'. Я отредактировал свой ответ, чтобы отразить это. – iamdave

+0

Я уже использовал функцию группировки выше. В принципе, я хочу рассчитать вещи по множеству пользователей. Этот набор пользователей основан на том, к какому событию они пришли. Я хочу делать вычисления по разному набору пользователей каждый раз. Итак, то, что вы предлагаете, не будет работать, к сожалению. –