2016-03-04 5 views
1

Так что я только начал заниматься программированием SQL, и я решил сделать много-много отношений с двумя таблицами и сводной таблицей. И я собираюсь отправить эту информацию через API, и было бы здорово, если бы я мог легко пропустить данные в моем интерфейсе.Группируйте несколько строк в одном от многих до многих.

Таблицы выглядеть следующим:

story_template

id, title, body, author

пустой

id, title, description

blanks_story_te mplate (Pivot)

id, sid, bid, position

Я сумел извлечь информацию, мне нужно, используя этот запрос:

SELECT 
    st.title, st.body, st.author, 
    b.*, 
    bst.position 
FROM story_template AS st 
     INNER JOIN blanks_story_template AS bst ON st.id = bst.sid 
     INNER JOIN blanks AS b ON bst.bid = b.id 
     ORDER BY bst.position 

И это приводит к следующим:

Result after running query

Так что мне интересно, возможно ли комбинировать несколько ро ws в один? Так, например, результаты выше, будет выглядеть следующим образом:

st.id, title, body, author, b.id, title, description, position 
-------------------------------------------------------------- 
1  title body author 1, title, description, position 
          2, title, description, position 
          3, title, description, position 
2  title body author 1, title, description, position 
          2, title, description, position 
          3, title, description, position 

Я посмотрел в GROUP_CONCAT() и что будет работать, если все столбцы будут иметь значения, так как тогда я смог бы разделить их в массиве. Но мне это действительно не помогает, если blank.description будет NULL в одной строке, тогда я бы потерял тот blank.id, который будет принадлежать ..

Это можно сделать в запросе, или мне придется его разобрать перед отправкой это с API?

Прошу прощения, если что-то кажется неопределенным, и если вам нужно, чтобы я разъяснил все, что я был бы рад сделать.

+0

Можно попытаться изменить 'INNER JOIN заготовки AS B ON bst.bid = b.id' к' RIGHT OUTER JOIN заготовки AS B ON bst.bid = b.id'? –

+0

Лучшее подавление повторяющихся значений в PHP: см. [Этот вопрос] (http://stackoverflow.com/questions/34751841/return-null-instead-of-repeated-value-in-certain-columns/34752372#34752372) – trincot

+0

@ DarshanMehta Это не повлияло на результаты. trincot Итак, нет хорошего способа сделать это в SQL? – jzasnake

ответ

1

Вы можете сделать это в MySQL, используя переменную пользователя, чтобы указать, соответствует ли строка той же story_template, что и предыдущая строка. Вам нужно изменить ORDER BY так, чтобы строки для того же story_template были вместе.

SELECT IF(id = @last_st, '', id) AS id, 
     IF(id = @last_st, '', title) as title, 
     IF(id = @last_st, '', body) as body, 
     IF(id = @last_st, '', author) AS author, 
     blank_id, blank_title, description, position, 
     @last_st := id 
FROM (
    SELECT 
     st.id, st.title, st.body, st.author, 
     b.id AS blank_id, b.title AS blank_title, b.description, 
     bst.position 
    FROM story_template AS st 
      INNER JOIN blanks_story_template AS bst ON st.id = bst.sid 
      INNER JOIN blanks AS b ON bst.bid = b.id 
      ORDER BY st.id, b.id 
    ) AS x 
CROSS JOIN (SELECT @last_id := null) AS y 
+0

У вас была ошибка во втором 'SELECT', где' st.st_id' нужно изменить на 'st.id AS st_id' и то же самое в' ORDER BY'. Однако это не решило проблему, все, что она сделала, это добавить еще один столбец с идентификатором story_template. Или я понимаю это неправильно? – jzasnake

+0

Я исправил его, просто использую 'id' всюду и добавляю только префикс для' b.id'. – Barmar

+0

Ahaa, круто! Теперь он работает, как описано в вопросе.Таким образом, это уменьшит время запроса при пропуске st.body (который является реальным длинным текстом несколько раз) или он все еще загружает st.body, но просто скрывает его от результата? – jzasnake

Смежные вопросы