Выберите не менее 6 значений в 100 столбцах в строке MySQL - PullRequest
0 голосов
/ 11 октября 2019

У меня есть таблица с 103 столбцами. Первый столбец (rowID) - это индекс строки, следующий содержит дату, а третий - строку (имя), затем есть 100 столбцов (с именами от A1 до A100), каждый из которых содержит целое число. Я пытаюсь написать запрос для получения 6 самых низких значений из этих 100 столбцов для каждой строки.

Вот что я пробовал. Мне пришлось выписать все 100 столбцов (есть ли лучший способ?), И это дает мне только наименьшую 1, а НЕ наименьшую 6:

SELECT LEAST(A1,A2,A3,A4,...A100) FROM myTable WHERE rowID=1

Я думаю, может быть, я могу использовать 5 запросовчтобы каждый раз выполнять наименьшую команду, возвращая результат бэкэнду, который затем исключит столбец, который содержал наименьшее значение в предыдущем запросе. Однако я не уверен, что это лучший способ, потому что я пытаюсь сохранить все это в MySQL. Есть ли способ использовать подзапросы для этого? Или другой эффективный метод. Буду признателен за любую помощь!

Редактировать: Мне также нужно знать столбцы, из которых были получены эти минимальные 6 значений.

1 Ответ

2 голосов
/ 11 октября 2019

Вы, похоже, храните многозначный атрибут в денормализованном виде.

Если вам нужно сделать ориентированные на множество сравнения этих значений, они должны храниться в строках ,не столбцы.

Вы можете "отменить" их, чтобы каждое значение находилось в отдельной строке, например:

SELECT 1 AS ValNo, A1 AS Val FROM MyTable WHERE rowID=1
UNION ALL 
SELECT 2, A2 FROM MyTable WHERE rowID=1
UNION ALL
SELECT 3, A3 FROM MyTable WHERE rowID=1
UNION ALL
SELECT 4, A4 FROM MyTable WHERE rowID=1
UNION ALL
...
UNION ALL
SELECT 100, A100 FROM MyTable WHERE rowID=1

Затем, поместив это в подзапрос, получите 6 самых низких значений.

SELECT ValNo, Val
FROM ( ... subquery above ... ) AS t
ORDER BY Val
LIMIT 6

Было бы лучше сохранить таблицу с одним столбцом для значения и до 100 строк для каждого rowId:

CREATE TABLE MyNewTable (
  RowId INT,
  OrdinalId TINYINT, -- 1 to 100
  Aval INT,
  PRIMARY KEY (RowId, OrdinalId)
);

Тогда вы можете запросить его более просто:

SELECT OrdinalId, Aval
FROM MyNewTable
WHERE RowId = 1
ORDER BY Aval
LIMIT 6;
...