2017-10-14 36 views
1
SELECT 
    e.*, 
    (
     SELECT GROUP_CONCAT(topic_name) 
     FROM topic 
     WHERE id IN (e.topic_ids)) AS topics 
FROM exam e 

结果:从主查询逗号分隔的ID获取数据时,子查询返回一行?

topics = xyz topic

该查询返回话题,因为结果的一个名字,但是当我用这个:

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类型字段相同的值。 是否有任何与数据类型字段的问题?

+1

是的,它不是用在测试兼容。逗号分隔的列是一个字符串,而in是一组值。因此,一个'1,4'的db字符串不能用in(1,4)成功测试,但可以用('1,4')成功测试,即完全匹配。在(1)中找不到任何存储的字符串为'1,4'的东西 –

+2

更好地规范化您的结构 –

+1

修复您的数据结构。这应该是你努力的方向。以分隔字符串存储列表不是SQLish的方式。 –

回答

0

首先,让我来讲解一下CSV在字段中有多糟糕。

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

这就是撒旦在关系数据库中的样子。也许是最差的,只是后

“让我们把列,行和使用递归加入让一切恢复。”

应该是怎么回事?

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

太可怕了,不是吗? – Strawberry

+0

@Strawberry是的,还有一个真正的全能杀手:/人们没有进入“** RELATIONAL **数据库”? – Blag