У меня три таблицы:
Таблица 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.
В вашем запросе есть несколько ошибок (например, нет столбца 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....
subcat_id_for_upper_cat1, subcat_id_for_upper_cat2,upper_1, upper_2
кажется немного произвольным: может быть любое количество отношений между документами и подкатегориями, но вы предоставляете только 2 столбца. И может быть любое количество higher_level_category_id
. Как вы определяете, в каком из двух «верхних» столбцов вы хотите получить информацию об идентификаторе более высокого уровня? Текущий group_concat()
представляет гораздо более реальный результат: то есть вы получаете число subcat_id
и другое число upper
идентификаторов, не назначая их каким-либо фиксированным столбцам.