簡體   English   中英

從主查詢逗號分隔的ID中獲取數據時,SubQuery返回一行?

[英]SubQuery returns one row when getting data from main query comma separated ids?

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類型字段相同。 字段的數據類型有問題嗎?

首先,讓我向您介紹現場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小提琴

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

結果

| 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 |

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM