За последние 24 часа нас посетили 20804 программиста и 1135 роботов. Сейчас ищут 311 программистов ...

Выборка записей по сложному алгоритму.

Тема в разделе "MySQL", создана пользователем Ryaaaaa, 19 фев 2020.

  1. Ryaaaaa

    Ryaaaaa Новичок

    С нами с:
    19 фев 2020
    Сообщения:
    3
    Симпатии:
    0
    Это бд тех. обслуживания машин.

    Есть несколько таблиц cars(id_car,gov_num,brand), brands(id_brandsbrand_name), mileages(id_mileage,idcar,value), docs_to(idbrand1,interval).

    Мне нужно средствами sql вывести определённые gov_num и brand_name с учётом превышения двух последних value по idcar из mileages значению interval(есть интервалы для разных то1 и то2). Я реализовал такой алгоритм языком программирования, но в sql без возможности использования переменных и прочих удобных штук я бессилен.

    Если вы видите вариант реализации проще - предлагайте.
     
  2. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.068
    Симпатии:
    1.231
    Адрес:
    там-сям
    gov_num это типа госномер? :D "license plate number" это ваще-то

    пожалуйста дай пример данных. и как должен выглядеть результат. как-то не очень понятна вот эта фраза:
    "с учётом превышения двух последних value по idcar"

    в идеале, данные надо скопировать на db-fiddle.com чтобы там же получить ответ от нас.
     
  3. Ryaaaaa

    Ryaaaaa Новичок

    С нами с:
    19 фев 2020
    Сообщения:
    3
    Симпатии:
    0
    Ну да gov(erment)_num это гос номер.

    На картинке в правой части результат под то1 и то2. На цифры не обращайте внимание.

    Могу предложить дамп бд.

    Совсем забыл. MySQL 8.0
     

    Вложения:

    • 24424.png
      24424.png
      Размер файла:
      65,1 КБ
      Просмотров:
      9
  4. Artur_hopf

    Artur_hopf Активный пользователь

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    405
    @Ryaaaaa в sql есть переменные и прочие удобные штуки:
    для примера mssql
    Код (Text):
    1. DECLARE @shiftType int, @now datetime,  @morning datetime, @night datetime, @taskdate datetime, @diff datetime;
    2.  
    3. SET @now = GETDATE();
    4. SET @morning = DATEADD( hour, 7, DATEDIFF( dd, 0, @now ) );
    5. SET @night = DATEADD( hour, 19, DATEDIFF( dd, 0, @now ) );
    6. SET @diff = DATEADD( SECOND, -300 , @now );
    7.        
    8. IF @now >= @morning AND @now <= @night
    9.     SET @shiftType = 0;
    10. ELSE
    11.     SET @shiftType = 1;
    12.        
    13. IF @now >= @morning
    14.     SET @taskdate = CAST( @now AS date );
    15. ELSE
    16.     SET @taskdate = DATEADD(DAY, -1, CAST( @now AS date ));
    17.  
    18. WITH
    19. table_1 AS
    20. (
    21.     --запрос 1
    22. ),
    23.  
    24. table_2 AS
    25. (
    26.    
    27.    --запрос 2
    28. ),
    29.  
    30. table_3 AS
    31. (
    32.    --запрос 3
    33. ),
    34.  
    35. table_4 AS
    36. (
    37.      --запрос 4
    38. ),
    39.  
    40. table_5 AS
    41. (
    42.     --запрос 5
    43. ),
    44.  
    45. table_6 AS
    46. (
    47.     --запрос 6
    48. )
    49.  
    50. SELECT tb3.[Oid],
    51.     tb3.[Name],
    52.     tb3.[State],
    53.     tb1.[IdleType],
    54.     tb2.[CycleNorm],
    55.     tb2.[Weight],
    56.     (CASE WHEN tb4.[Warning] IS NULL THEN (1) ELSE ( tb4.[Warning] ) END) AS [Warning],
    57.     (CASE WHEN tb5.[ProductionPlan] IS NULL THEN (0) ELSE ( tb5.[ProductionPlan] ) END) AS [ProductionPlan],
    58.     (CASE WHEN tb6.[Rfid] IS NULL THEN (0) ELSE tb6.[Rfid] END) AS [Rfid]
    59. FROM table_3 AS tb3
    60. LEFT JOIN table_1 AS tb1 ON tb1.[RepairObject] = tb3.[Oid]
    61. LEFT JOIN table_2 AS tb2 ON tb2.[RepairObject] = tb3.[Oid]
    62. LEFT JOIN table_4 AS tb4 ON tb4.[RepairObject] = tb3.[Oid]
    63. LEFT JOIN table_5 AS tb5 ON tb5.[RepairObject] = tb3.[Oid]
    64. LEFT JOIN table_6 AS tb6 ON tb6.[RepairObject] = tb3.[Oid]
    65. ORDER BY tb3.[Name] ASC
     
  5. Ryaaaaa

    Ryaaaaa Новичок

    С нами с:
    19 фев 2020
    Сообщения:
    3
    Симпатии:
    0
    Ну не сказал бы. Я вот допустим не могу создать класс для хранения данных, не могу воспользоваться моими любимыми коллекциями, не могу использовать индексацию.
     
  6. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.591
    Симпатии:
    360
    Может, здесь: DB Fiddle?