【问题标题】:Delimited foreign ID's in a mysql fieldmysql 字段中分隔的外部 ID
【发布时间】:2012-10-09 14:52:04
【问题描述】:

前言:是的,我意识到这是糟糕的设计,但我无法改变这一点。

问题

我有一个客户表,其中有一个“产品”字段。以下是示例客户产品字段中的示例:

36;40;362

这些数字中的每一个都引用了 products 表中的一条记录。我正在尝试做一个

(SELECT group_concat(productName) from products where productID=???)

但我遇到了分隔符问题。我知道如何删除分号,并尝试过“where INSTR”或 IN 但没有运气。

将整个字段返回给 PHP 然后在那里分解/解析的最佳方法是什么?

【问题讨论】:

    标签: php mysql split explode


    【解决方案1】:

    您可以在 MySQL 中使用FIND_IN_SET 函数。

    您只需用逗号替换分号并在查询中使用它:

    SELECT group_concat(productName)
    FROM products
    WHERE FIND_IN_SET(productID, ???) > 0
    

    请记住??? 应该用逗号分隔!

    【讨论】:

      【解决方案2】:

      就像你说的,这不是这样做的方法。但既然这是一个不完美的世界:

      假设数据库结构如下:

      +-PRODUCTS---------+    +-CUSTOMERS---------+------------+
      | ID | productName |    | ID | customerName | productIDs |
      +----+-------------+    +----+--------------+------------+
      |  1 | Foo         |    |  1 | Alice        | 1;2        |
      +----+-------------+    +----+--------------+------------+
      |  2 | Bar         |    |  2 | Bob          | 2;3        |
      +----+-------------+    +----+--------------+------------+
      |  3 | Baz         |    |  3 | Charlie      |            |
      +----+-------------+    +----+--------------+------------+
      

      然后是这样的查询:

         SELECT customers.*, 
                GROUP_CONCAT(products.id) AS ids, 
                GROUP_CONCAT(productName) AS names
           FROM customers
      LEFT JOIN products
             ON FIND_IN_SET(products.id, REPLACE(productIDs, ";", ","))
       GROUP BY customers.id
      

      会返回:

      +-RESULT------------+------------+-----+---------+
      | ID | customerName | productIDs | ids | names   |
      +----+--------------+------------+-----+---------+
      |  1 | Alice        | 1;2        | 1,2 | Foo,Bar |
      +----+--------------+------------+-----+---------+
      |  2 | Bob          | 2;3        | 1,2 | Bar,Baz |
      +----+--------------+------------+-----+---------+
      |  3 | Charlie      |            | 1,2 | NULL    |
      +----+--------------+------------+-----+---------+
      

      FIND_IN_SET( search_value, comma_separated_list ) 在给定的逗号分隔字符串中搜索值。所以,你需要用逗号替换分号,这显然是REPLACE() 所做的。这个函数的返回值是它找到第一个匹配的位置,例如:

      SELECT FIND_IN_SET(3, '1,3,5')   = 2
      SELECT FIND_IN_SET(5, '1,3,5')   = 3
      SELECT FIND_IN_SET(7, '1,3,5')   = NULL
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-18
        • 1970-01-01
        • 1970-01-01
        • 2013-06-07
        • 2021-10-24
        相关资源
        最近更新 更多