sql—与mysql结果相关的列数

h6my8fg2  于 2021-06-23  发布在  Mysql
关注(0)|答案(1)|浏览(357)

我有三张table:
表1-文件:

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

每个文档可以分配给多个子类别-此关系位于表2中。
表2-匹配文档id和子类别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-子类别-还有一个子类别表,其中包含其id、名称和另一个(更高)级别的类别的更高级别的类别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;

我注意到,当我给order by子句另一个参数subcategories.higer\ level\ category\ id时,这会给我一个更好的结果,但这仍然远远不是我想要的。问题在于动态列的创建应该与子类别的数量有关。更高级别的类别id。

luaexgnf

luaexgnf1#

您的查询中似乎有一些错误(例如。g。没有列 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、c#或php。。。。

相关问题