一列中包含多个值的查询


Query with multiple values in a column

我有一个类似于的表

id     name            children
1      Roberto         Michael,Dia
2      Maria           John,Alex
3      Mary            Alexandre,Diana

我的问题是;我想知道谁有一个叫亚历克斯的孩子。

我不能在SQL中使用"where children = 'Alex'",因为我在同一单元格中有多个名称。

所以我使用"where children LIKE '%Alex%'"——看起来很聪明,但与此同时,我开始像亚历克斯一样:(亚历山大或者我想得到迪亚,但结果是迪亚和戴安娜:(

我怎样才能得到那种数据类型的单身亚历克斯?

我希望我能用我糟糕的英语来解释我的问题:D

最好的解决方案是规范化您的模式。您应该有一个单独的表,每个子级有一行,而不是逗号分隔的列表。然后,您可以使用此表来查找具有特定子级的父级。请参阅@thesite的回答以获取此示例。

但如果由于某种原因无法做到这一点,可以使用FIND_IN_SET:

WHERE FIND_IN_SET('Alex', children)

您应该将数据拆分为两个表。

第一个看起来像这个

ID    Name
1     Roberto
2     Maria
3     Mary

第二个像

ParentId     child
1            Michael
1            Dia
2            John
2            Alex

等等

然后您就可以执行您想要的查询,而不必担心like,并且您的数据更可用

这就是为什么您希望在这里有两个表。

parents:
id  name
1   Roberto  
2   Maria
3   Mary
children:
id  parentid name
1   1        Michael
2   1        Dia
3   2        John
4   2        Alex
5   3        Alexandre
6   3        Diana

现在,您可以通过连接或存在来更有效地查询:

SELECT *
FROM Parents
WHERE EXISTS(
    SELECT * 
    FROM Children 
    WHERE parentid=Parents.id 
      AND Children.name='Alex'
 )

我宁愿为孩子和父母制作不同的表,就像这样。

父母表

parent_id     name            
1             Roberto         
2             Maria           
3             Mary     

儿童表

children_id  parent_id  name
1            1          Michael     
2            1          Dia 
3            2          John

依此类推