MySQL как повторить запрос для каждого значения в столбце - PullRequest
0 голосов
/ 23 апреля 2020

Это пример таблиц и используемых столбцов:

t_values:
╔════════════╦═══════════════╗
║ Serial     ║ Date          ║
╠════════════╬═══════════════╣
║ 1234214    ║ 2010.11.01... ║
╠════════════╬═══════════════╣
║ ABC9123213 ║ 2001.01.01... ║
╠════════════╬═══════════════╣
║ ...        ║ ...           ║
╚════════════╩═══════════════╝

t_devices:
╔════════════╦══════╗
║ Serial     ║ Type ║
╠════════════╬══════╣
║ 1234214    ║ 2    ║
╠════════════╬══════╣
║ ABC9123213 ║ 13   ║
╠════════════╬══════╣
║ ...        ║ ...  ║
╚════════════╩══════╝

У меня есть этот запрос, чтобы получить значения счетчиков, сгруппированные по слабым, но также разделенные полем Type:

SELECT CONCAT(YEAR(V.Date), '/', WEEK(V.Date)) AS Yearweek, COUNT(*) AS QTY, D.TypeID
FROM 
t_values    AS V
JOIN 
t_devices   AS D 
ON V.Serial = D.Serial
WHERE D.TypeID = 1 --This is what I change manually
GROUP BY Yearweek
ORDER BY YEAR(V.Date) ASC, WEEK(V.Date) ASC
;

Этот столбец D.TypeID имеет около 13 различных значений, поэтому мне нужно вручную изменить его для каждого значения и повторно выполнить запрос.

Но, очевидно, это анти-DRY подход. Поскольку я новичок в MySQL, у меня есть базовые c идеи о написании такого рода запросов " stati c", но у меня нет конкретного опыта или идеи о правильных решениях для некоторых других условия Dynami c.

Я знаю о возможности хранимых процедур. Это то, что я должен попытаться использовать именно для таких задач, или есть какой-то более простой, встроенный инструмент для итерации этого запроса с разными значениями выбранного столбца вместо этого?

Править : Меня попросили уточнить, как мне вообще понадобятся результаты, так как я мог бы просто сгруппировать по столбцу Yearkweek и оставить часть WHERE. Только то, что это даст мне одну большую таблицу с парами Yearweek-TypeID.

Мне нужен запрос, который я отправил, с их собственными собственными отдельными результатами Типа, возможно, выполняемыми динамически после друг друга. И, возможно, я вызову этот запрос на другом языке или реализую его с помощью ORM и буду сохранять результаты в кадрах данных или превосходить каждый раз, когда выполняется запрос.

Поэтому я просто не уверен, какое направление является предпочтительным , Должен ли я использовать переменную и l oop, которые на языке, с которым я запускаю запрос SQL, или создать процедуру с собственным MySQL, предварительно вызвав этот вызов.

1 Ответ

1 голос
/ 23 апреля 2020

Вы можете получить все данные в одном результате следующим образом:

SELECT D.TypeID,
       CONCAT(YEAR(V.Date), '/',
       WEEK(V.Date)) AS Yearweek, COUNT(*) AS QTY, D.TypeID
FROM 
t_values    AS V
JOIN 
t_devices   AS D 
ON V.Serial = D.Serial
GROUP BY D.TypeID, Yearweek
ORDER BY D.TypeID,YEAR(V.Date) ASC, WEEK(V.Date) ASC
;

Или вы можете получить ввод, используя связанную переменную,

SELECT CONCAT(YEAR(V.Date), '/', WEEK(V.Date)) AS Yearweek, COUNT(*) AS QTY, D.TypeID
FROM 
t_values    AS V
JOIN 
t_devices   AS D 
ON V.Serial = D.Serial
WHERE D.TypeID = ?
GROUP BY Yearweek
ORDER BY YEAR(V.Date) ASC, WEEK(V.Date) ASC
;

Как вы предоставляете переменную происходит зависеть от того, что вы используете для вызова SQL.

Вы можете создать хранимую процедуру. Отличный способ вызова хранимых процедур - использование связанной переменной, но вы можете передать аргумент, сгенерировав строку SQL с аргументом.

CREATE PROCEDURE type_data
(IN type_in INTEGER)
BEGIN
  SELECT CONCAT(YEAR(V.Date), '/', WEEK(V.Date)) AS Yearweek, COUNT(*) AS QTY, D.TypeID
  FROM 
  t_values    AS V
  JOIN 
  t_devices   AS D 
  ON V.Serial = D.Serial
  WHERE D.TypeID = type_in
  GROUP BY Yearweek
  ORDER BY YEAR(V.Date) ASC, WEEK(V.Date) ASC
END
;

CALL type_data(1);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...