Ответы пользователя по тегу MySQL
  • Как правильно построить архитектуру таблиц в моем случае? Как не плодить таблицы?

    igruschkafox
    @igruschkafox
    Специалист по сопровождению БД MS SQL
    Группы храните в формате XML в отдельной таблице
    а в строку где необходимо указать некий набор (Группу) передавайте ID Группы
    Ответ написан
    Комментировать
  • Что делать если одновременно пойдут запросы на последний продукт?

    igruschkafox
    @igruschkafox
    Специалист по сопровождению БД MS SQL
    А в чем проблема ?

    Ну пойдут запросы и ладно ...
    вроде так и должно быть
    Ответ написан
    Комментировать
  • Запрос на выборку данных из нескольких таблиц?

    igruschkafox
    @igruschkafox
    Специалист по сопровождению БД MS SQL
    логично что не выводит
    у Вас нет пересекающихся наборов в условиях

    Where
    "Один уникальный набор"
    And
    "Второй уникальный набор"
    Ответ написан
    Комментировать
  • Какие Вы знаете программы для переноса данных из одной бд в другую?

    igruschkafox
    @igruschkafox
    Специалист по сопровождению БД MS SQL
    1. ETL (Интегрейшен сервис) <-- выполняет все Ваши условия
    2. Запросы к прилинкованному серверу

    Еще варианты полного переноса данных на другой сервер:
    3. Репликации таблиц
    4. ОлвейсОн базы данных (MS SQL)
    5. Лог шипинг (MS SQL - повторение транзакций на другом сервере)
    Ответ написан
    Комментировать
  • Как извлекать данные группами с поиском по строкам групп?

    igruschkafox
    @igruschkafox
    Специалист по сопровождению БД MS SQL
    Select distinct group_id
    from MyTable
    where data = 'data132'
    Ответ написан
    Комментировать
  • ORDER с GROUP BY в прикрепленной таблице?

    igruschkafox
    @igruschkafox
    Специалист по сопровождению БД MS SQL
    Select ... over (partition by ... ORDER BY ...)
    from ..
    Ответ написан
    Комментировать
  • Возможно ли в одном запросе сделать SELECT и INSERT?

    igruschkafox
    @igruschkafox
    Специалист по сопровождению БД MS SQL
    в MS SQL есть Output
    возвращает заинсерченные строки в том числе присвоенные айдишники и гуиды ;)
    Ответ написан
    Комментировать
  • Как реализовать множество разнотипных свойств у элемента?

    igruschkafox
    @igruschkafox
    Специалист по сопровождению БД MS SQL
    XML
    JSON
    Ответ написан
    Комментировать
  • Как выбрать "товары" содержащие одновременно несколько "параметров"?

    igruschkafox
    @igruschkafox
    Специалист по сопровождению БД MS SQL
    Примерно так (с точки зрения оптимизации стоит еще подумать но принцип рабочий)
    -- Создаем таблицы
    -- Таблица товаров
    Create table article (
    id_article int identity(1,1),
    Name_article NVarchar(20))
    
    -- Таблица парметров 
    Create table article_param (
    id_param int identity(1,1),
    Name_param Nvarchar (100))
    
    -- Таблица соотношения
    CREATE TABLE dbo.article_param_item
    (
      id int identity(1,1),
       id_article  int not NULL,
       id_param  int not NULL
    )
    
    
     truncate table article
     truncate table article_param
     truncate table article_param_item
    
    
    -- Заполняем таблицы данным для примера
    INSERT INTO [dbo].[article] (Name_article) VALUES (N'Утюг')
    INSERT INTO [dbo].[article] (Name_article) VALUES (N'Стол')
    INSERT INTO [dbo].[article] (Name_article) VALUES (N'Телевизор')
    
    INSERT INTO [dbo].[article_param](Name_param)VALUES (N'Пластиковый')
    INSERT INTO [dbo].[article_param](Name_param)VALUES (N'Плоский')
    INSERT INTO [dbo].[article_param](Name_param)VALUES (N'Красный')
    INSERT INTO [dbo].[article_param](Name_param)VALUES (N'Бракованный')
    INSERT INTO [dbo].[article_param](Name_param)VALUES (N'Новый')
    
    -- Заполняем таблицу соотношений
    INSERT INTO [dbo].[article_param_item]([id_article],[id_param])VALUES(1,1) -- Утюг Пластиковый
    INSERT INTO [dbo].[article_param_item]([id_article],[id_param])VALUES(1,5) -- Утюг Новый
    
    INSERT INTO [dbo].[article_param_item]([id_article],[id_param])VALUES(2,1) -- Стол Пластиковый
    INSERT INTO [dbo].[article_param_item]([id_article],[id_param])VALUES(2,2) -- Стол Плоский
    INSERT INTO [dbo].[article_param_item]([id_article],[id_param])VALUES(2,3) -- Стол Бракованный
    INSERT INTO [dbo].[article_param_item]([id_article],[id_param])VALUES(2,4) -- Стол Красный
    
    INSERT INTO [dbo].[article_param_item]([id_article],[id_param])VALUES(3,2) -- Телевизор Плоский
    INSERT INTO [dbo].[article_param_item]([id_article],[id_param])VALUES(3,5) -- Телевизор Новый
    
    
    -- Отображаем все товары с их параметрами
    SELECT *
      FROM [dbo].[article] art 
      join [article_param_item] rel on art.id_article=rel.id_article
      join [article_param] parametr on parametr.id_param =rel.id_param
    
    -- Для поиска по нескольким параметрам поиска необходимо занести их во временную таблицу
    Create table ##Param_table (id_parm int)
    
    -- Допустим ищем товары удовлетворяющие двум параметрам
    -- Плоский и Новый
    insert into  ##Param_table (id_parm) values (2)
    insert into  ##Param_table (id_parm) values (5)
    
    -- Находим все товары удовлетворяющие нашему списку параметров
    
    ;with CTE_ArticleInParam as
    (
    SELECT art.[Name_article],parametr.Name_param
    ,count (parametr.Name_param) over (partition by art.[Name_article]) as 'Count_Param'
    FROM [dbo].[article] art 
    join [article_param_item] rel on art.id_article=rel.id_article 
    join [article_param] parametr on parametr.id_param =rel.id_param 
    join ##Param_table ParTabl on ParTabl.id_parm = rel.id_param 
    )
    
    select [Name_article],Name_param,Count_Param
    from CTE_ArticleInParam
    where Count_Param = (select count (*) from ##Param_table)
    Ответ написан
    Комментировать
  • На какой улице (`Street`) больше домов?

    igruschkafox
    @igruschkafox
    Специалист по сопровождению БД MS SQL
    Select Count(id) , Street
    from Mytable
    group by Street
    Ответ написан
    9 комментариев
  • Как подключить к crystal report .sql файл?

    igruschkafox
    @igruschkafox
    Специалист по сопровождению БД MS SQL
    В Репорт Сервисе - внутри самого отчета (RDL файла) хранится запрос (так называемый - "набор данных")
    Скорее всего в Кристал репорте тоже самое

    А на скрине у Вас только ОДБС - это всего лишь подключение к конкретной базе данных
    Ответ написан
    Комментировать
  • Как сделать вывод результатов поиска по совпадениям?

    igruschkafox
    @igruschkafox
    Специалист по сопровождению БД MS SQL
    в MS SQL надо использовать Data Quality Service - в результате запроса будет колонка Similarity (подобие - в процентах) по ней можно и сортировать

    что то подобное должно быть и в других СУБД
    Ответ написан
    Комментировать
  • Нужен ли индекс или нет?

    igruschkafox
    @igruschkafox
    Специалист по сопровождению БД MS SQL
    2 вариант
    Ответ написан
    Комментировать
  • Можете посоветовать книжку по проектированию баз данных?

    igruschkafox
    @igruschkafox
    Специалист по сопровождению БД MS SQL
    Сейчас буду ругаться :)

    1) Выбор СУБД, т.е. что в каких случаях выбирать
    Основываясь на своем опыте (22 - проекта) рекомендую так:
    СУБД это всего лишь инструмент
    - Если в организации есть хорошие специалисты которые могут эффективно работать на MS SQL знают все его возможности и понимают почему он так дорого стоит - тогда MS SQL
    - Если в организации есть хорошие специалисты Ораклы - тогда лучше ставить Ораклу
    - Если обрабатываются очень очень секретные данные - тогда тоже лучше что то отличное от MS SQL - например Ораклу (так как операционная система отличная от Виндовс) - но в большинстве компаний данные не представляют интерес для спецслужб :)

    2) Выбор подсистем субд
    - Было бы здорово понять что такое "Подсистема СУБД"

    3) Освещение моментов выбора индексов
    - Все зависит от запросов которые идут в базу, а так же от данных. На начальном этапе индексирования в MS SQL пригодится Помощьник по настройки ядра СУБД. Дальше уже надо исходить из анализа планов запросов (не обязательно всех, а хотя бы самых длительных). При этом надо учитывать что на тестовых данных будут оптимальны одни индексы, а через год эксплуатации имеющиеся индексы уже могут стать не самым лучшим способом поиска по таблицам .... это админить надо базу ...

    4) Может быть какие-нибудь паттерны проектирования
    - В моей компании только и делают что переучивают пришедших специалистов у которых в голове свои патерны! Честное слово - в институте такой Херни на вдалбливают в голову студентов что диву даешься (например: некоторые разработчики в каждой таблице вставляют поле идентети - хотя по нему поиск не производится,и еще на это же поле вешают кластерный индекс - "Мудацкое Российское Высшее Образование"(с))
    - Патерны Хорошо! Замечательно! Но универсальных способов нет!
    Ознакомится с ними стоит что бы не делать ошибок - но даже если сделали такую ошибку - то никто не мешает потом исправить :) разбить таблицу на несколько или объеденить пару таблиц в одну. Главное что бы апликушники (программисты клиентской части) пользовались принципами ООП (что бы сильно не переделывать код программы при изменении структуры базы)
    Ответ написан
    4 комментария
  • Как расположить в несколько столбцов данные из одной строки?

    igruschkafox
    @igruschkafox
    Специалист по сопровождению БД MS SQL
    Комментировать
  • Как правильно сформировать SQL запрос?

    igruschkafox
    @igruschkafox
    Специалист по сопровождению БД MS SQL
    Есть массив слов(с)

    тогда все просто
    сохраните этот массив во временную таблицу
    и сделайте джойн своей таблицы с таблицей массива

    ПС если массив большой - не забудьте для него на временной таблице сделать индекс
    Ответ написан
    Комментировать
  • Удалить все, кроме * sql?

    igruschkafox
    @igruschkafox
    Специалист по сопровождению БД MS SQL
    Сначала проверте что вы будете удалять следующим запросом

    Select  *  from MyTable  where user_id = 21 and delete not like 'not'


    Если в результате запроса именно те строки которые хотите удалить - то удаляйте запросом
    Delete from MyTable  where user_id = 21 and delete not like 'not'
    Ответ написан
    Комментировать
  • Как кэшировать подзапрос в MySQL select?

    igruschkafox
    @igruschkafox
    Специалист по сопровождению БД MS SQL
    Вариант с одним джойном
    (MS SQL - но наверно и в MySql будет что то подобное)

    План запроса будет быстрее чем изначальный вариант только в сочитании с индексом
    CREATE NONCLUSTERED INDEX [NonClusteredIndex-20151120-180424] ON [dbo].[T1]
    (
    [id] ASC,
    [item1] ASC,
    [item2] ASC,
    [item3] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

    -- Создаем таблицы
    CREATE TABLE T1 (id INT IDENTITY(1,1),item1 int,item2 int,item3 INT)
    CREATE TABLE T2 (id INT IDENTITY(1,1),item_id INT, itype VARCHAR(10) )
    
    -- Наполняем данными 
    -- Таблица T1
    INSERT INTO [dbo].[T1] ([item1],[item2],[item3])VALUES(11,12,13)
    INSERT INTO [dbo].[T1] ([item1],[item2],[item3])VALUES(21,22,23)
    INSERT INTO [dbo].[T1] ([item1],[item2],[item3])VALUES(31,32,33)
    INSERT INTO [dbo].[T1] ([item1],[item2],[item3])VALUES(41,42,43)
    INSERT INTO [dbo].[T1] ([item1],[item2],[item3])VALUES(51,52,53)
    INSERT INTO [dbo].[T1] ([item1],[item2],[item3])VALUES(11,32,53)
    INSERT INTO [dbo].[T1] ([item1],[item2],[item3])VALUES(17,32,53)
    
    -- Таблица T2
    INSERT INTO [dbo].[T2]([item_id],[itype]) VALUES(21,'A')
    INSERT INTO [dbo].[T2]([item_id],[itype]) VALUES(11,'B')
    INSERT INTO [dbo].[T2]([item_id],[itype]) VALUES(13,'B')
    INSERT INTO [dbo].[T2]([item_id],[itype]) VALUES(41,'A')
    INSERT INTO [dbo].[T2]([item_id],[itype]) VALUES(42,'A')
    INSERT INTO [dbo].[T2]([item_id],[itype]) VALUES(43,'A')
    INSERT INTO [dbo].[T2]([item_id],[itype]) VALUES(17,'A')
    
    
    -- Исходный запрос
    SELECT * FROM T1 WHERE 
    T1.item1 IN (SELECT item_id FROM T2 WHERE itype='A') AND 
    T1.item2 IN (SELECT item_id FROM T2 WHERE itype='A') AND 
    T1.item3 IN (SELECT item_id FROM T2 WHERE itype='A')
    
    -- Запрос с одним джойном
    ;WITH CTE_OneSubQuery
    AS
    (
    
    SELECT DISTINCT
    tt1.id, tt1.item1,tt1.item2,tt1.item3
    ,CASE (COUNT (tt2.item_id)  OVER (PARTITION BY tt1.id)) WHEN 3 THEN 1 END AS [kol]
    FROM T1 tt1
    JOIN t2 tt2 ON tt2.item_id =CASE
    	WHEN tt2.item_id = tt1.item1 THEN tt1.item1
    	WHEN tt2.item_id = tt1.item2 THEN tt1.item2
    	WHEN tt2.item_id = tt1.item3 THEN tt1.item3
    END 
    
    WHERE  tt2.itype = 'A'
    )
    
    SELECT  id, item1,item2,item3 FROM CTE_OneSubQuery 
    WHERE kol =1
    Ответ написан
  • Как Написать запрос sql обновления таблицы данными с другой таблицы?

    igruschkafox
    @igruschkafox
    Специалист по сопровождению БД MS SQL
    В таких случаях рекомендую делать так :)
    Не самое кошерное решение - но зато понятно что происходит и минимум возможности для ошибки :)
    
    --пример таблиц
    CREATE TABLE uzer1 (id INT, name1 NVARCHAR(20))
    CREATE TABLE uzer2 (id INT, name2 NVARCHAR(20))
    
    -- Заполняем данными
    
    -- Таблица [uzer1]
    INSERT INTO [dbo].[uzer1]([id],[name1]) VALUES(1,'Вася')
    INSERT INTO [dbo].[uzer1]([id],[name1]) VALUES(2,'Петя')
    INSERT INTO [dbo].[uzer1]([id],[name1]) VALUES(3,'Гундяев')
    -- Таблица [uzer2]
    INSERT INTO [dbo].[uzer2]([id],[name2]) VALUES(1,'Вася')
    INSERT INTO [dbo].[uzer2]([id],[name2]) VALUES(3,'Кирил')
    
    
    --Шаг 1 
    -- Пишем CTE с джойном двух таблиц - Для проверки что именно у нас на что заменится
    
    ;WITH cte_Update
    as
    (SELECT t1.Name1 AS 'Вот это'
    , t2.Name2 AS 'апдейтим на это'
    FROM [uzer1] t1
    JOIN [uzer2] t2 ON t1.id=t2.id)
    
    --Проверяем что у нас проапдетится именно то что нам надо
    SELECT * FROM cte_Update
    
    --Шаг 2 
    -- пишем все тоже самое только вместо селекта Апдейт
    ;wITH cte_Update
    as
    (SELECT t1.Name1 AS 'Вот это'
    , t2.Name2 AS 'апдейтим на это'
    FROM [uzer1] t1
    JOIN [uzer2] t2 ON t1.id=t2.id)
    
    --Апдейтим
    UPDATE  cte_Update
    SET [Вот это] =[апдейтим на это] 
    
    -- я использую такой способ, мне он кажется более безопасным и быстрым в написании :)
    Ответ написан
  • Как составить sql запрос для выборки статей и комментариев из связанных таблиц?

    igruschkafox
    @igruschkafox
    Специалист по сопровождению БД MS SQL
    ответ на 1 вопрос:
    По теории быстрее второй вариант (тот который у Вас помечен как - "Первый раз я написал так"
    потому что:
    - SELECT * FROM
    так писать не стоит - Звездочка всегда работает медленне чем перечисление колонок, не намного :) но все же
    - просто Left join будет работать быстрее, чем подзапрос - особенно если есть необходимые индексы

    ответ на 2 вопрос:
    "чтобы возвращалось:[данные первой статьи,[первый комментарий, второй, ...]]"(с)
    поддержка такого формата ---> "JSON" реализована в MS SQL 2016

    Ну смотри :)
    Сам напросился :)

    -- Делаем таблички
    CREATE TABLE story( id int ,[text] text,author_id int )
    CREATE TABLE story_comments( id int,s_id INT,[text] text)
    
    -- Заполнем данными
    
    TRUNCATE TABLE [story]
    TRUNCATE TABLE [story_comments]
    
    INSERT INTO [dbo].[story]([id],[text],[author_id])VALUES(1,'Статья 1',1)
    INSERT INTO [dbo].[story]([id],[text],[author_id])VALUES(2,'Статья 2',2)
    
    INSERT INTO [dbo].[story_comments]([id],[s_id],[text])VALUES(1,1,'Первый комент Первой статьи')
    INSERT INTO [dbo].[story_comments]([id],[s_id],[text])VALUES(2,1,'Второй комент Первой статьи')
    INSERT INTO [dbo].[story_comments]([id],[s_id],[text])VALUES(3,1,'Третий комент Первой статьи')
    
    -- Сам запрос
    
    ;WITH cte 
    AS
    ( 
    SELECT [text2]=
    (
    SELECT 
    --s.id     AS 'Story_ID',
           s.[text]  AS 'Story_Text'
    	   ,
         (
    SELECT ISNULL(
    REPLACE( 
    REPLACE(
    REPLACE(
    (SELECT [text]=
    (SELECT sc.[text]AS 'comment_Text'
    FROM [story_comments] sc
    WHERE  s.id=sc.[s_id]
    FOR XML PATH (''))),'</comment_Text><comment_Text>',',')
    ,'<comment_Text>','['),'</comment_Text>',']')
    ,'[NULL]')
    )  
    FROM   [story] s
    FOR XML PATH('')
    ))
    
    SELECT '['+
    REPLACE(
    replace (
    REPLACE (text2,'<Story_Text>','[')
    ,'</Story_Text>[',',[')
    ,'][','],[')+']'
     FROM cte
    
     Ответ:
     [[Статья 1,[Первый комент Первой статьи,Второй комент Первой статьи,Третий комент Первой статьи],[Статья 2,[NULL]]
    Ответ написан
    Комментировать