Гость
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Как продублировать строку в запросе / 13 сообщений из 13, страница 1 из 1
11.02.2020, 16:03
    #39925264
maratoss
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как продублировать строку в запросе
Все привет, помогите пожалуйста с запросом:

Суть такова:
Есть бургер и всякие дополнения к нему, и у бургера и у самих дополнений есть цена.
Вот так это выглядит:

lines
idnamesum1burger1

ingredients
idline_idnamesumtype11onion2021garlic3031tomato4141carrot5151pepper62

Вопрос:
Нужно сделать отчет в котором покажет сколько действительно стоит бургер без использования UNION ALL

Но есть хитрость одна:
дополнения с типом 0 должны войти в стоимость самого бургера, а все остальные как отдельные строки

report
namesumtypeburger60burger|tomato41burger|carrot51burger|pepper62

Я тут накидал запрос нерабочий, он не учитывает стоимость самого бургера, как туда добавить еще бургер без union, голову ломаю.
Можно было бы продублировать строку, но как.
Вообщем буду признателен за любую помощь.


Код: sql
1.
2.
3.
4.
5.
SELECT l.id, i.type, SUM(i.sum)
FROM _lines l
LEFT JOIN _ingr i ON i.line_id = l.id
GROUP BY l.id,
	case when i.`type` = 0 then i.`type` ELSE i.id END;




Исходные данные:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
-- --------------------------------------------------------
-- Host:                         127.0.0.1
-- Server version:               5.7.25-log - MySQL Community Server (GPL)
-- Server OS:                    Win64
-- HeidiSQL Version:             10.2.0.5599
-- --------------------------------------------------------

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET NAMES utf8 */;
/*!50503 SET NAMES utf8mb4 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;

-- Dumping structure for table _ingr
CREATE TABLE IF NOT EXISTS `_ingr` (
  `id` int(11) NOT NULL,
  `line_id` int(11) NOT NULL,
  `name` varchar(50) COLLATE utf8_bin NOT NULL DEFAULT '',
  `sum` int(11) NOT NULL,
  `type` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `FK___lines` (`line_id`),
  CONSTRAINT `FK___lines` FOREIGN KEY (`line_id`) REFERENCES `_lines` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

-- Dumping data for table _ingr: ~0 rows (approximately)
/*!40000 ALTER TABLE `_ingr` DISABLE KEYS */;
INSERT INTO `_ingr` (`id`, `line_id`, `name`, `sum`, `type`) VALUES
	(1, 1, 'onion', 2, 0),
	(2, 1, 'garlic', 3, 0),
	(3, 1, 'carrot', 4, 1),
	(4, 1, 'tomato', 5, 1),
	(5, 1, 'pepper', 6, 2);
/*!40000 ALTER TABLE `_ingr` ENABLE KEYS */;

-- Dumping structure for table _lines
CREATE TABLE IF NOT EXISTS `_lines` (
  `id` int(11) NOT NULL,
  `name` varchar(50) COLLATE utf8_bin NOT NULL DEFAULT '',
  `sum` int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

-- Dumping data for table _lines: ~1 rows (approximately)
/*!40000 ALTER TABLE `_lines` DISABLE KEYS */;
INSERT INTO `_lines` (`id`, `name`, `sum`) VALUES
	(1, 'burger', 1);
/*!40000 ALTER TABLE `_lines` ENABLE KEYS */;

/*!40101 SET SQL_MODE=IFNULL(@OLD_SQL_MODE, '') */;
/*!40014 SET FOREIGN_KEY_CHECKS=IF(@OLD_FOREIGN_KEY_CHECKS IS NULL, 1, @OLD_FOREIGN_KEY_CHECKS) */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;


...
Рейтинг: 0 / 0
11.02.2020, 16:54
    #39925288
maratoss
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как продублировать строку в запросе
Тут скорей всего проблема в хранении данных:
эти ингредиенты с типом 0 должны быть в таблице lines с указанием родителя ParentId и тогда было бы все проще
...
Рейтинг: 0 / 0
11.02.2020, 16:59
    #39925293
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как продублировать строку в запросе
Код: sql
1.
GROUP BY (_ingr.type>0) * _ingr.id
...
Рейтинг: 0 / 0
11.02.2020, 17:34
    #39925340
entrypoint
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как продублировать строку в запросе
maratoss,

maratoss

Нужно сделать отчет в котором покажет сколько действительно стоит бургер без использования UNION ALL


почему именно без UNION ALL ?
...
Рейтинг: 0 / 0
11.02.2020, 19:56
    #39925384
maratoss
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как продублировать строку в запросе
entrypoint,

С union all на реальных данных почему-то долго работает
если взять одну и ту же таблицу, объединить и попробовать поискать по первичному ключу то занимает это несколько секунд
в таблицы где-то ~100к строк


Код: sql
1.
2.
3.
4.
5.
6.
SELECT d.id FROM (
	SELECT lns1.id FROM orderlines lns1
	UNION all
	SELECT lns2.id FROM orderlines lns2
) d
WHERE d.id = '02207950-5f81-4b5c-bc46-08dbf029b566'
...
Рейтинг: 0 / 0
11.02.2020, 20:04
    #39925386
maratoss
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как продублировать строку в запросе
Akina
Код: sql
1.
GROUP BY (_ingr.type>0) * _ingr.id



Не совсем так работает, не учитывает стоимость самого бургера
burger: 1 + onion: 2 + garlic: 3 = должно получиться 6
этот запрос возвращает 5 для type = 0.

Код: sql
1.
2.
3.
4.
SELECT l.id, i.type, SUM(i.sum)
FROM _lines l
LEFT JOIN _ingr i ON i.line_id = l.id
GROUP BY (i.type>0) * i.id;
...
Рейтинг: 0 / 0
11.02.2020, 20:14
    #39925389
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как продублировать строку в запросе
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
SELECT CONCAT(_lines.name, 
               CASE WHEN type 
                    THEN CONCAT('|', 
                                ANY_VALUE(ingr.name)) 
                    ELSE '' 
                    END) name, 
       SUM(ingr.`sum`) `sum`, 
       ANY_VALUE(ingr.type) type
FROM _lines
JOIN ( SELECT id, line_id, name, `sum`, type
       FROM _ingr
       UNION ALL
       SELECT 0, id, name, `sum`, 0
       FROM _lines ) ingr ON _lines.id = ingr.line_id
GROUP BY _lines.name, (ingr.type > 0) * ingr.id, ingr.type;


fiddle .
...
Рейтинг: 0 / 0
11.02.2020, 20:45
    #39925402
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как продублировать строку в запросе
Ну и, как просили, вариант без UNION ALL:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
SELECT CASE WHEN ANY_VALUE(I.type) = 0
            THEN L.name
            ELSE CONCAT(L.name, '|', ANY_VALUE(I.name))
            END name,
       CASE WHEN ANY_VALUE(I.type) = 0
            THEN SUM(I.`sum`) + ANY_VALUE(L.`sum`)
            ELSE ANY_VALUE(I.`sum`)
            END `sum`,
       ANY_VALUE(I.type) type
FROM _lines L
JOIN _ingr I ON L.id = I.line_id
GROUP BY L.name, (I.type > 0) * I.id;


fiddle .
...
Рейтинг: 0 / 0
12.02.2020, 10:02
    #39925488
maratoss
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как продублировать строку в запросе
Akina,

Идеалити! Спасибо, то что нужно.
В мой запрос получается нужно было добавить только вот это, но я чет тупанул :)
Код: sql
1.
, case when i.type = 0 then SUM(i.sum) + l.sum ELSE SUM(i.sum) END s



Всем спасибооо!
...
Рейтинг: 0 / 0
12.02.2020, 12:16
    #39925566
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как продублировать строку в запросе
Я всё же настоятельно рекомендую использовать ANY_VALUE(), чтобы всё не обсыпалось при случайном или плановом включении ONLY_FULL_GROUP_BY.
...
Рейтинг: 0 / 0
12.02.2020, 13:09
    #39925614
maratoss
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как продублировать строку в запросе
Akina,

Хорошее замечание, благодарю, учту
...
Рейтинг: 0 / 0
12.02.2020, 16:41
    #39925844
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как продублировать строку в запросе
maratoss

Вопрос:
Нужно сделать отчет в котором покажет сколько действительно стоит бургер без использования UNION ALL



Я на SQL.ru уже хожу, только чтобы поржать...
Тут не только ответить ни на что нельзя, а и даже что-то понять, настолько невменяемые запросы.
...
Рейтинг: 0 / 0
15.02.2020, 15:47
    #39927021
Андрей B.
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как продублировать строку в запросе
А мне очень даже интересно.
Не стандартно мыслят товарищи...
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Как продублировать строку в запросе / 13 сообщений из 13, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]