MariaDB 10.0: разбить 1 строку на несколько на основе значения столбца - PullRequest
0 голосов
/ 02 ноября 2018

У меня есть таблица, которая выглядит примерно так:

| id  | item   | count |
| --- | ------ | ----- |
| 1   | item a | 3     |
| 2   | item b | 2     |
| 3   | item c | 4     |

Как я могу сделать запрос к базе данных, чтобы на счетчике отображалась 1 строка? То есть как это:

| id  | item   | count |
| --- | ------ | ----- |
| 1   | item a | 3     |
| 1   | item a | 3     |
| 1   | item a | 3     |
| 2   | item b | 2     |
| 2   | item b | 2     |
| 3   | item c | 4     |
| 3   | item c | 4     |
| 3   | item c | 4     |
| 3   | item c | 4     |

Если это поможет, я создал скрипту БД: https://www.db -fiddle.com / f / wRZgBYkDM18c5fk7tgkBkA / 0

Ответы [ 2 ]

0 голосов
/ 06 ноября 2018

Запрос ниже уродлив, но работает:

SELECT id, item, count 
FROM (
   SELECT @curRow := @curRow + 1 AS row_number FROM mytable 
   INNER JOIN (SELECT @curRow := 0) AS ROW 
   ON @curRow < (SELECT max(count) from mytable) 
) AS B LEFT JOIN mytable C ON B.row_number <= C.count

ПРИМЕЧАНИЕ: верные данные будут возвращены только в том случае, если общее количество записей в вашей таблице => max (count).

Оригинальный подход найден в ответ здесь

0 голосов
/ 02 ноября 2018

Возможно, SQL - не лучший вариант для простого решения того, что вам нужно, однако альтернативой является использование хранимых процедур, курсоров и временной таблицы (пример приведен в MariaDB 10.3.9, но с некоторыми изменениями. это будет работать в MariaDB 10.0):

DELIMITER //

CREATE PROCEDURE `sp_test`()
BEGIN
  CREATE TEMPORARY TABLE IF NOT EXISTS `temp_items`
  SELECT `id`, `item`, `count`
  FROM `items`
  LIMIT 0;

  FOR `repeat_row` IN (
    SELECT `id`, `item`, `count`
    FROM `items`
  ) DO
    FOR `current` IN 1..`repeat_row`.`count`
      DO
      INSERT INTO `temp_items`
      SELECT
        `repeat_row`.`id`,
        `repeat_row`.`item`,
        `repeat_row`.`count`;
    END FOR;
  END FOR;

  SELECT `id`, `item`, `count`
  FROM `temp_items`;
  DROP TEMPORARY TABLE IF EXISTS `temp_items`;
END//

DELIMITER ;

См. dbfiddle .

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