WITH
cte1 AS ( SELECT id, col1 val FROM test UNION ALL
SELECT id, col2 FROM test UNION ALL
SELECT id, col3 FROM test ),
cte2 AS ( SELECT id, GROUP_CONCAT(val ORDER BY val) FIO
FROM cte1
GROUP BY id )
SELECT test.id, test.col1, test.col2, test.col3, GROUP_CONCAT(cte2_2.id) ids
FROM test
JOIN cte2 cte2_1 USING (id)
JOIN cte2 cte2_2 USING (FIO)
GROUP BY test.id, test.col1, test.col2, test.col3id col1 col2 col3 ids
1 Иванов Иван Иванович 1,2
2 Иван Иванович Иванов 1,2
3 Петров Сергей Алексеевич 3,4,5
4 Петров Сергей Алексеевич 3,4,5
5 Сергей Алексеевич Петров 3,4,5DEMOвыполняться будет на MS SQL Server, версию не могу сказать.
что эффективнее: хранить в записи список id объектов, которые должны быть обработаны при обращении к этой записи, в виде строки (скрипт будет парсить строку и отрабатывать каждый id), либо сделать триггер и хранимую процедуру (MySQL), которая возьмёт эту работу на себя?
SELECT prices.*
FROM prices
JOIN ( SELECT size, MAX(`date`) AS `date`
FROM prices
WHERE price
-- AND `date` <= @some_date
GROUP BY size ) AS last_nonzero_date USING (size, `date`);(size, `date`) - уникально.SELECT MIN(`min_price`) OVER () as `min_price`,
MAX(`max_price`) OVER () as `max_price`,
`item_id` as `id`
FROM `product_table`
WHERE `id` IN (SELECT тут запрос)
Akina, да, версия 5.7.21 и она, я так понимаю, не поддерживает оконные функции.
SELECT t2.min_price,
t2.max_price,
t1.item_id as id
FROM product_table t1
CROSS JOIN ( SELECT MIN(min_price) AS min_price,
MAX(max_price) AS max_price
FROM product_table ) t2
WHERE t1.id IN (SELECT тут запрос) Есть папка, которая хранит в себе sql файлы для создания бд, таблиц в этой бд, импорт данных в эти таблицы.
Как автоматизировать запуск этих sql скриптов?
нужно удалить записи с одинаковыми date и user_id
DELETE t1.*
FROM tablename t1
JOIN tablename t2 USING (date, user_id)
WHERE t1.id > t2.idа лучше не создавать их
CREATE UNIQUE INDEX indexname ON tablename (date, user_id)SELECT CASE WHEN sender_id = 1
THEN receiver_id
ELSE sender_id
END AS buddy
FROM message
WHERE 1 IN (sender_id, receiver_id)
GROUP BY buddy
ORDER BY MAX(sent_at)SELECT user.username
FROM user
JOIN ( SELECT CASE WHEN sender_id = 1
THEN receiver_id
ELSE sender_id
END AS id,
MAX(sent_at) sent_at
FROM message
WHERE 1 IN (sender_id, receiver_id)
GROUP BY 1 ) ids USING (id)
ORDER BY ids.sent_at SELECT DISTINCT (regexp_split_to_array(commend, E'\\s+'))[:3] AS first_3_words
FROM orders
ORDER BY first_3_words[2]; SELECT DISTINCT
key,
FIRST_VALUE(value1) OVER (PARTITION BY key
ORDER BY CASE WHEN value1 IS NULL
THEN 1
ELSE 0 END, id DESC) AS value1,
FIRST_VALUE(value2) OVER (PARTITION BY key
ORDER BY CASE WHEN value2 IS NULL
THEN 1
ELSE 0 END, id DESC) AS value2,
FIRST_VALUE(value3) OVER (PARTITION BY key
ORDER BY CASE WHEN value3 IS NULL
THEN 1
ELSE 0 END, id DESC) AS value3
FROM tablename
-- WHERE key IN ( {список значений} )переписать таблицу в нормальную форму
SELECT `p`.`sum`, `p`.`type`, `p`.`visit`
FROM `visits` AS `v`
JOIN `payments` AS `p` ON `v`.`id` = `p`.`visit`
WHERE DATE(p.date) = '2021-10-04' AND `v`.`office` = '1'SELECT `p`.`sum`, `p`.`type`, `p`.`visit`
FROM `visits` AS `v`
JOIN `payments` AS `p` ON `v`.`id` = `p`.`visit`
WHERE p.date >= '2021-10-04'
AND p.date < '2021-10-05'
AND `v`.`office` = '1'visits (office, id).payments (`date`, visit) и payments (visit, `date`), посмотреть какой из них используется, удалить неиспользуемый.AND `v`.`office` = 1. В исходном виде, если поле числовое, то и поле, и значение приводятся к floating-point number, и только потом сравниваются. SELECT p.*, GROUP_CONCAT(c.name) countries
FROM p
JOIN с ON FIND_IN_SET(c.id, p.country)
GROUP BY p.idНапример, пишу я такой SELECT и все нормально
SELECT Trip.plane, Trip.id
Но при таком мне выдает ошибку
SELECT Trip.plane, COUNT(Trip.plane) planes