如何将逗号分隔列转换为行并添加计数器

时间:2013-01-06 17:07:28

标签: php mysql pyrocms

我有一张包含这些值的表

表:文件

id  |       document
----|-------------
1   |   doc.txt , doc1.txt , doc2.rtf , doc3.docx , doc4.doc
2   |   doc.txt 
3   |   doc.txt , doc1.txt 
4   |   doc.txt , doc1.txt , doc2.rtf 
5   |   doc.txt , doc1.txt , doc2.rtf , doc3.docx , doc4.doc
6   |   doc.txt , doc1.txt , doc2.rtf , doc3.docx 
7   |   doc.txt , doc1.txt , doc2.rtf , doc3.docx , doc4.doc
8   |   doc.txt , doc1.txt , doc2.rtf 
9   |   doc.txt , doc1.txt , doc2.rtf , doc3.docx , doc4.doc
10  |   doc.txt , doc1.txt 

SQL FIDDLE SCHEMA

我需要这样的结果。其中id = 5

Counter |   docs
    ----|-----------
    1   |   doc.txt
    2   |   doc1.txt
    3   |   doc2.rtf
    4   |   doc3.docx
    5   |   doc4.doc

id = 4

Counter |   docs
    ----|-----------
    1   |   doc.txt
    2   |   doc1.txt
    3   |   doc2.rtf

你看我需要爆炸逗号分隔列并计算有多少值。我不喜欢这个架构,但我正在研究一个现有的项目,不能改变它。我需要在用户界面中显示计数器。所以反制也是必要的。我怎样才能做到这一点?另外我不能在php结束,因为我使用pyrocms,我需要使用pyrocms tage显示它,这不允许我在视图中使用PHP。

3 个答案:

答案 0 :(得分:2)

看看这个SQL FIDDLE,也许就是你想要的。您必须使用帮助程序表sequence

SELECT * FROM
(SELECT S.Id Counter,
REPLACE(SUBSTRING(SUBSTRING_INDEX(document, ' , ', S.Id),
       LENGTH(SUBSTRING_INDEX(document, ' , ', S.Id - 1)) + 1),
       ' , ', '') docs
FROM documents D, sequence S
WHERE D.id = 3) A
WHERE A.docs <> ''

答案 1 :(得分:2)

使用存储过程可以解决您的问题。 here's您的问题的确切重复已经已解决

答案 2 :(得分:0)

我担心没有简单的方法来创建SQL查询,也没有可用的分割功能。

您可以做的是创建自己的功能,如here

所述

您也可以直接在php代码中处理结果。