【问题标题】:Query with multiple values in a column查询一列中的多个值
【发布时间】:2015-02-21 07:20:57
【问题描述】:

我有一张这样的桌子:

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

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

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

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

如何获得该数据类型的单个 Alex?

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

【问题讨论】:

  • 见规范化。它是关系数据库的基础。
  • 在一个表字段下有多个孩子不是一个好主意。最好创建第二个存储孩子姓名的表,并使用外键将其连接到主表。
  • Strawberry 和kidA 都在说同样的事情:您需要将“children”分成一个单独的表,然后将其链接回“parents”。该过程称为“normalization”。父母和孩子之间的“链接”称为“foreign key”。
  • FoggyDay 也是如此;-)

标签: php mysql


【解决方案1】:

最好的解决方案是规范化您的架构。您应该有一个单独的表,每个孩子都有一行,而不是逗号分隔的列表。然后,您可以加入此表以查找具有特定孩子的父母。请参阅@themite 的答案以获取此示例。

但如果由于某种原因你不能这样做,你可以使用FIND_IN_SET

WHERE FIND_IN_SET('Alex', children)

【讨论】:

    【解决方案2】:

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

    第一个看起来像这样

    ID    Name
    1     Roberto
    2     Maria
    3     Mary
    

    第二个像这样

    ParentId     child
    1            Michael
    1            Dia
    2            John
    2            Alex
    

    等等。

    那么您就可以进行您想要的查询,而不必担心like,并且您的数据更有用

    【讨论】:

      【解决方案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'
       )
      

      【讨论】:

        【解决方案4】:

        我宁愿为孩子和父母做不同的桌子,像这样。

        家长桌

        parent_id     name            
        1             Roberto         
        2             Maria           
        3             Mary     
        

        儿童桌

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

        ....等等

        【讨论】:

        • 我只是在取笑你的成语:-)
        • 好吧,我不想和他谈技术,因为他似乎不太了解(基于他的问题)。
        猜你喜欢
        • 2012-01-10
        • 2021-09-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多