我有一个类似于的表
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
依此类推