【问题标题】:Unable to select rows containing multiple values in mysqli无法在 mysqli 中选择包含多个值的行
【发布时间】:2014-03-17 15:53:28
【问题描述】:
CREATE TABLE  `product` (
  `productId` int(10) unsigned NOT NULL auto_increment,
  `productName` varchar(100) NOT NULL default '',
  `hashTags` varchar(255) 
.......
)

我在单个单元格中的 hashTags 列中有多个值,例如 11、12、13、14

SELECT  hashTags  FROM `product` WHERE  hashTags in (11,14);

当我尝试这个查询时,它只选择第一个值为真的列,查询对应的单元格,那么我该如何继续?

+------------+
| hashTags   |
+------------+
| 11,14,12,13|
+------------+
| 13,14,15   |
+------------+

我想编写查询,它选择包含14 的行作为它的hashTag

【问题讨论】:

    标签: mysql sql database stored-procedures mysqli


    【解决方案1】:

    首先,在一列中存储多个值是不好的!见database normalization

    尝试使用like 运算符:

    SELECT  hashTags  
    FROM `product` 
    WHERE hashTags like '%,14,%' 
       or hashTags like '%,14' 
       or hashTags like '14,%' 
       or hashTags like '14'.
    

    但这不是维护数据的最佳方式,此处描述的理论太多,但想法如下:

    使用您的示例并假设您的产品的 ID 为 1,创建一个附加的 HashTag(hashTagId, productId) 表来存储特定产品的标签,以下行将存储您在列 hashTags 中的相同信息。

    HashTags
    --------
    11  |  1
    12  |  1
    13  |  1
    14  |  1
    

    现在,要查询带有标签 11 和 14 的特定产品,请使用如下查询:

    SELECT productId, 
           productName, ... 
    FROM Product, 
         HashTags 
    WHERE HashTag.productId = Product.productId 
      AND HashTag.hashTagId = 14 
       OR hashTagId = 13.
    

    实际上,查询可能更复杂,以确保产品具有两个哈希标签,但这是基本思想。请参阅第一行中的链接。

    【讨论】:

    • 当我执行类似查询时,它给出的结果也包含 114 和 144
    • 那么我如何维护特定产品的多个哈希标签值?
    • 我改变了我的答案。立即尝试。
    • 这是不可维护的,开始规范你的数据库
    • @EmilioGort 你能帮我吗?我只需要维护单个帖子的多个哈希标签
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-18
    • 1970-01-01
    • 2023-04-01
    • 2019-10-03
    • 2014-12-16
    • 1970-01-01
    • 2021-07-20
    相关资源
    最近更新 更多