Sql запрос возвращает дубликаты

202
02 октября 2018, 12:20

Всем привет. Вот скрин моей схемы

Я хочу сделать запрос без дубликатов и потерей полей.

SELECT
  *
FROM
  `strategy`
  LEFT JOIN strategyoptions ON strategyoptions.strategy_id=strategy.id 

Вот результат этого запроса:

Как видно из картинки, у меня есть несколько полей дубликатов Nokia с разными полями options_id. Это значит, что при передаче результата запроса он будет выглядеть вот так:

{
  "id": "1",
  "strategy_title": "Nokia",
  "strategy_description": "Lorem ipsum dolor sit amet",
  "strategy_current_money": "9000",
  "risk_colors_id": "1",
  "color_name": "green",
  "color_number": "#96D062",
  "risk_value": "10",
  "options_id": "1",
  "strategy_id": "1",
  "options_value": "5"
}, {
  "id": "2",
  "strategy_title": "Nokia",
  "strategy_description": "Lorem ipsum dolor sit amet",
  "strategy_current_money": "9000",
  "risk_colors_id": "1",
  "color_name": "green",
  "color_number": "#96D062",
  "risk_value": "10",
  "options_id": "2",
  "strategy_id": "1",
  "options_value": "3"
}, {
  "id": "8",
  "strategy_title": "Nokia",
  "strategy_description": "Lorem ipsum dolor sit amet",
  "strategy_current_money": "9000",
  "risk_colors_id": "1",
  "color_name": "green",
  "color_number": "#96D062",
  "risk_value": "10",
  "options_id": "3",
  "strategy_id": "1",
  "options_value": "2"
}, {
  "id": "9",
  "strategy_title": "Nokia",
  "strategy_description": "Lorem ipsum dolor sit amet",
  "strategy_current_money": "9000",
  "risk_colors_id": "1",
  "color_name": "green",
  "color_number": "#96D062",
  "risk_value": "10",
  "options_id": "4",
  "strategy_id": "1",
  "options_value": "6"
}, {
  "id": "10",
  "strategy_title": "Nokia",
  "strategy_description": "Lorem ipsum dolor sit amet",
  "strategy_current_money": "9000",
  "risk_colors_id": "1",
  "color_name": "green",
  "color_number": "#96D062",
  "risk_value": "10",
  "options_id": "5",
  "strategy_id": "1",
  "options_value": "4"
},

Можно ли составить sql запрос так, чтобы не было дублированных строк? А именно:

{
  "id": "1",
  "strategy_title": "Nokia",
  "strategy_description": "Lorem ipsum dolor sit amet",
  "strategy_current_money": "9000",
  "risk_colors_id": "1",
  "color_name": "green",
  "color_number": "#96D062",
  "risk_value": "10",
  "options_id": "1",
  "strategy_id": "1",
  "options_value": "5",
  "options_id": "2",
  "strategy_id": "1",
  "options_value": "3",
  "options_id": "3",
  "strategy_id": "1",
  "options_value": "2",
  "options_id": "4",
  "strategy_id": "1",
  "options_value": "6",
  "options_id": "5",
  "strategy_id": "1",
  "options_value": "4"
}
Answer 1

Приведенный вами желаемый JSON не является валидным, т.к. содержит одинаковые имена полей объекта. На вашем месте я бы делал такой JSON

{
  "id":"1",
  "strategy_title":"Nokia",
  "strategy_description":"Lorem ipsum dolor sit amet",
  "strategy_current_money":"9000",
  "risk_colors_id":"1",
  "color_name":"green",
  "color_number":"#96D062",
  "risk_value":"10",
  "options": [
    {"options_id":"1","strategy_id":"1","options_value":"5"},
    {"options_id":"2","strategy_id":"1","options_value":"3"},
    {"options_id":"3","strategy_id":"1","options_value":"2"},
    {"options_id":"4","strategy_id":"1","options_value":"6"},
    {"options_id":"5","strategy_id":"1","options_value":"4"}
  ]
}

Ну а тогда задача сводится к банальной:

  1. Вы делаете запрос

    SELECT * FROM `strategy`
    

    и заполняете базовые поля

  2. А потом для каждой строки из strategy делаете запрос

    SELECT * FROM strategyoptions WHERE strategy_id = :id
    

    и заполняете массив

READ ALSO
Помогите доработать код jquery

Помогите доработать код jquery

Есть вот такой вот проблема https://jsfiddlenet/aq9Laaew/118529/

176
WinAPI перетаскивание формы, предупреждение CA1901, CA1060 NativeMethods

WinAPI перетаскивание формы, предупреждение CA1901, CA1060 NativeMethods

Реализовал перетаскивание формы за тело при помощи WinAPI:

259
Чем вызвана ошибка UnityEditor.AssetDatabase:Refresh()?

Чем вызвана ошибка UnityEditor.AssetDatabase:Refresh()?

Столкнулся с такой ошибкой:

289