按序列化值搜索

时间:2013-04-14 14:55:32

标签: php mysql

这是我用来从数据库中获取数据的查询

SELECT
    product_description.name as name, 
    product.image as iurl
FROM
    product_description, product
WHERE
    product_description.product_id = product.product_id
    AND product.product_id
    AND product.product_id = '33';
  1. 为什么此查询产生双重结果?

  2. 我想自动搜索存储在数据库中的多个值(id),而不是手动添加AND product.product_id='?'部分。值以序列化形式存储。

  3. 类似

    ... AND product.product_id in (setting.value WHERE key='featured');
    

    我知道查询不正确,只是试着展示我想要的东西。

    表'设置':

    value    | key
    -------------------
    23,43,28 | featured
    

2 个答案:

答案 0 :(得分:1)

这在某种程度上破坏了关系范式,你应该有三个值为23,43和28的条目。

然后我再次猜测字段value是一个varchar(你知道“value”和“key”是mysql的保留字吗?)所以你可能想查看字符串里面找到模式“, 23,“在场内。类似于:WHERE CONCAT(',', field_value, ',') LIKE "%,23,%"

答案 1 :(得分:1)

解决方案

要获取存储在products表(逗号分隔)中的所有settings的详细信息,您可以使用FIND_IN_SET()

SELECT
    product_description.description, 
    product.name,
    product.id
FROM
    product_description, product
WHERE
    product_description.id = product.id
    AND FIND_IN_SET(product.id, ( SELECT value FROM setting where `key` = 'featured' ) );

SQLFiddle

注意:您看到重复条目的原因可能是因为特定产品有多个描述,您可以使用GROUP_CONCAT处理此问题 以下应该有效

后记

您的数据库设计不好,应该是

product             -- All my products go here
product_details     -- Details of all the products ( A product could have multiple details)
categories          -- eg: Featured, Seasonal
product_categories  -- association of product to categories