SELECT
    e.*,
    (
        SELECT GROUP_CONCAT(topic_name)
        FROM topic
        WHERE id IN (e.topic_ids)) AS topics
FROM exam e


结果:

topics = xyz topic

此查询返回单个主题名称作为结果,但是当我使用this时:

SELECT
    e.*,
    (
        SELECT GROUP_CONCAT(topic_name)
        FROM topic
        WHERE id IN (1,4)) AS topics
FROM exam e


结果:

topics = xyz topic,abc topic

效果很好,并且检查表在DB中的值(以逗号分隔的主题ID = 1,4)与varchar type字段相同。
字段的数据类型有问题吗?

最佳答案

首先,让我向您介绍现场CSV的不良状况。

| id | topic_ids |
|----|-----------|
|  1 |     a,b,c |
|  2 |       a,b |


这就是Satan在关系数据库中的样子。大概是最坏的情况


  “让列作为行,并使用递归联接将所有内容取回。”


应该如何?

exam
| id |
|----|
|  1 |
|  2 |

exam_topic
| exam_id | topic_id |
|---------|----------|
|       1 |        a |
|       1 |        b |
|       1 |        c |
|       2 |        a |
|       2 |        b |

topic
| id |
|----|
|  a |
|  b |
|  c |




现在,尽管很糟糕,但这是使用FIND_IN_SET()的“动态”选择:

SELECT
e.*,
(
    SELECT GROUP_CONCAT(topic_name)
    FROM topic
    WHERE FIND_IN_SET(id, e.topic_ids) > 0
) AS topics
FROM exam e


SQL Fiddle

MySQL 5.6模式设置:

CREATE TABLE exam
    (`id` int, `topic_ids` varchar(5))
;

INSERT INTO exam
    (`id`, `topic_ids`)
VALUES
    (1, 'a,b,c'),
    (2, 'a,b'),
    (3, 'b,c,d'),
    (4, 'd')
;


CREATE TABLE topic
    (`id` varchar(1), `topic_name` varchar(4))
;

INSERT INTO topic
    (`id`, `topic_name`)
VALUES
    ('a', 'topA'),
    ('b', 'topB'),
    ('c', 'topC'),
    ('d', 'topD')
;


查询1:

    SELECT
    e.*,
    (
        SELECT GROUP_CONCAT(topic_name)
        FROM topic
        WHERE FIND_IN_SET(id, e.topic_ids) > 0
    ) AS topics
    FROM exam e


Results

| id | topic_ids |         topics |
|----|-----------|----------------|
|  1 |     a,b,c | topA,topB,topC |
|  2 |       a,b |      topA,topB |
|  3 |     b,c,d | topB,topC,topD |
|  4 |         d |           topD |

10-07 13:51
查看更多