Количество столбцов, связанных с результатами MySQL

0

У меня три таблицы:

Таблица 1 - документы:

ID    Title
====================
1     doc 1
2     doc 2
3     doc 3
4     doc 4

Каждый документ может быть присвоен нескольким подкатегориям - это отношение находится в таблице 2.

Таблица 2 - doc_subcategory, которая соответствует document_id и subcategory_id:

document_id    subcategory_id
============================
1              1
1              2
1              5
2              1
2              2
3              1     
3              7
4              2
4              3
4              5

Таблица 3 - подкатегории - также есть таблица подкатегорий, которая содержит ее идентификатор, имя и higer_level_category_id другого (высшего) уровня категории.

id    name           higer_level_category_id      
============================================
1     To buy         1
2     To give back   1
3     To send        1
4     To buy         2
5     To send        2
6     To throw       2
7     To destroy     2

Что нужно сделать, так это:

doc_id    doc_title    subcat_id        subcat_id       upper_1  upper_2
                       for_upper_cat1   for_upper_cat2

==========================================================================================
1         doc 1        1,2              5               1        2                        
2         doc 2        1,2              NULL            1        NULL
3         doc 3        1,7              7               1        2
4         doc 4        2,3              5               1        2

Я создал такой запрос, но я не знаю, как отделить подкатегории и верхние категории от отдельных столбцов:

SELECT
  documents.id as doc_id,
  documents.title as doc_title,
  group_concat(DISTINCT doc_subcategory.subcategory_id) as subcat_id,
  group_concat(DISTINCT subcategories.higer_level_category_id) as upper
FROM 
  documents
LEFT JOIN
  doc_subcategory
  ON
  (
    documents.id = doc_subcategory.id
  ) 
LEFT JOIN
  subcategories
  ON
  (
    doc_subcategory.subcategory_id = subcategories.id
  )
GROUP BY documents.id;

Я заметил, что когда я даю еще один параметр для заказа по предложению, который является subcategories.higer_level_category_id, это дает мне немного лучшие результаты, но все же это далеко не то, что я хочу. Проблема заключается в динамических столбцах, которые должны создаваться "на лету", которые относятся к числу подкатегорий. Higer_level_category_id.

  • 1
    Обычно у вас будет доступ к некоторому коду уровня приложения / уровня представления, где вы будете решать такие проблемы с отображением.
Теги:

1 ответ

0

В вашем запросе есть несколько ошибок (например, нет столбца doc_subcategory.id). Я собрал небольшую рекстестер-демо с вашим запросом. Вы можете найти его здесь: http://rextester.com/XOP97169

Я обновил ваш запрос до

SELECT
  documents.id as doc_id,
  documents.title as doc_title,
  group_concat(DISTINCT doc_subcategory.subcategory_id) as subcat_id,
  group_concat(DISTINCT subcategories.higher_level_category_id) as upper
FROM documents
LEFT JOIN doc_subcategory ON documents.id       = doc_subcategory.document_id 
LEFT JOIN subcategories   ON doc_subcategory.subcategory_id = subcategories.id
GROUP BY documents.id;

Это приводит к

doc_id  doc_title   subcat_id   upper
--------------------------------------
1       doc 1       1,2,5       1,2
2       doc 2       1,2         1,2
3       doc 3       1,7         1,2
4       doc 4       2,3,5       2,3

Возможно, вы можете проиллюстрировать несколько тонких точек на основе этой скрипки. Но, как уже сказал @Strawberry, "презентация" данных обычно должна быть оставлена для вашего приложения внедрения, будь то в JavaScript (node.js), python, С# или php....

  • 0
    Спасибо за обновление запроса. Именно такие результаты я получаю. Что касается приложения, я немного изменил имена столбцов и таблиц, чтобы они были более читабельными. Я не проверял этот запрос раньше, поэтому появилась небольшая ошибка в oc_subcategory.id. Тем не менее мне нужно иметь два дополнительных столбца, как описано выше.
  • 0
    Ваше расположение столбцов subcat_id_for_upper_cat1, subcat_id_for_upper_cat2,upper_1, upper_2 кажется немного произвольным: может быть любое количество отношений между документами и подкатегориями, но вы предоставляете только 2 столбца. И может быть любое количество higher_level_category_id . Как вы определяете, в каком из двух «верхних» столбцов вы хотите получить информацию об идентификаторе более высокого уровня? Текущий group_concat() представляет гораздо более реальный результат: то есть вы получаете число subcat_id и другое число upper идентификаторов, не назначая их каким-либо фиксированным столбцам.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню