在列中使用多个值进行查询

Query with multiple values in a column

提问人:user3479658 提问时间:2/21/2015 最后编辑:DNAuser3479658 更新时间:2/21/2015 访问量:3042

问:

我有一张表格,如下所示:

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

我的问题是; 我想找到谁有一个名叫亚历克斯的孩子。

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

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

我怎样才能获得该数据类型的单个 Alex?

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

PHP 的MySQL

评论

2赞 Strawberry 2/21/2015
请参阅规范化。这是关系数据库的基础。
3赞 kidA 2/21/2015
在表字段下放置多个子项不是一个好主意。最好创建第二个表来存储子表的名称,并使用外键将其连接到主表。
2赞 paulsm4 2/21/2015
Strawberry 和 kidA 都在说同样的事情:你需要将“孩子”分解到一个单独的表格中,然后将其链接回“父母”。该过程称为“规范化”。父母和孩子之间的“链接”被称为“外键”。
2赞 Strawberry 2/21/2015
FoggyDay 也是如此 ;-)
0赞 philipxy 8/28/2018
可能的重复 在数据库列中存储分隔列表真的有那么糟糕吗?

答:

0赞 thermite 2/21/2015 #1

应将数据拆分为两个表。

第一个看起来像这样

ID    Name
1     Roberto
2     Maria
3     Mary

第二个像这样

ParentId     child
1            Michael
1            Dia
2            John
2            Alex

等等。

然后,您可以进行所需的查询而不必担心,并且您的数据更加可用like

9赞 Barmar 2/21/2015 #2

最好的解决方案是规范化架构。您应该有一个单独的表,每个子表一行,而不是逗号分隔的列表。然后,您可以联接此表以查找具有特定子项的父项。有关这方面的例子,请参阅 @themite 的回答。

但是,如果由于某种原因无法执行此操作,则可以使用FIND_IN_SET

WHERE FIND_IN_SET('Alex', children)
0赞 Joep Beusenberg 2/21/2015 #3

这就是为什么你要在这里有两张表。

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'
 )
0赞 André Ferraz 2/21/2015 #4

我宁愿为孩子和父母做不同的桌子。

家长表

parent_id     name            
1             Roberto         
2             Maria           
3             Mary     

儿童餐桌

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

....等等

评论

0赞 Strawberry 2/21/2015
我只是在取笑你的成语:-)
0赞 André Ferraz 2/21/2015
好吧,我不想和他进行技术交流,因为看起来他知道的不多(基于他的问题)。