在multi varchar字段中选择id

时间:2015-10-03 07:51:02

标签: php sql

表类别
id int
description varchar

表产品
id int
id_cat varchar
等。

id | id_cat
1  | 1, 2, 3
2  | 3,4,6,2
3  | 1, 5 , 7
.
.
.

我需要像

这样的东西
Select * from produts where id_cat in ( '1','2' )

但不起作用!?

3 个答案:

答案 0 :(得分:2)

id | id_cat  
1  | 1, 2, 3

您的数据库布局不允许每个产品有多个类别 - 它只允许一个产品类别。 您需要的是一个附加表来保存产品类别关系。 此外,LIKE使用起来很昂贵,我建议使用JOIN。

试试这个结构:

CREATE TABLE category (
    id INT PRIMARY KEY,
    description VARCHAR(255)
);

CREATE TABLE product (
    id INT PRIMARY KEY,
    category_id INT,
    description VARCHAR(255)
);

CREATE TABLE product_category (
    product_id INT,
    category_id INT
);

然后,您可以使用类似于此的SQL来加入表:

SELECT C.Name as "Category Name", P.Name as "Product Name"
FROM Product P
INNER JOIN ProductCategory PC ON P.ProductID = PC.ProductID
INNER JOIN Category C ON PC.CategoryID = C.CategoryID
ORDER BY C.Name, P.Name;

有关工作示例,请参阅http://www.java2s.com/Code/Oracle/Table-Joins/GetCategoriesandProductswithJoins.htm

答案 1 :(得分:0)

如果您知道您的号码已订购,您可以使用以下内容:

select * from products where id_cat like '%1,%2'

如果不是这样:

select * from products where id_cat like '1,%' AND id_cat like '% 2,%'

另一种可能性,可能会进一步降低查询速度,使用rlike的正则表达式。优点是可以实现更多样化的表达。

确保您的表达式不会意外地找到两位数的单个数字。 这种方法可能有效,但以这种方式存储值并不是一种好的做法。您依赖这些数字列表来获得固定格式,可以轻松地使用自由文本字符串。如果这是一个选项,请尝试重新设计您的数据库。例如,在更多表中拆分数据,以便可以使用int列。

答案 2 :(得分:0)

你可以使用LIKE。您不希望匹配部分值,因此您必须在搜索中包含逗号。这也意味着您必须提供额外的逗号来搜索文本开头或结尾的值:

select 
  * 
from
  YourTable 
where 
  ',' || CommaSeparatedValueColumn || ',' LIKE '%,SearchValue,%'

但是这个查询会很慢,所有使用LIKE的查询都会很慢,尤其是使用前导通配符。

总是存在风险。如果值周围有空格,或者值本身可以包含逗号,在这种情况下它们被引号括起来(比如在csv文件中),这个查询不会起作用,你必须添加更多的逻辑,更慢地减慢您的查询。

更好的解决方案是为这些类别添加子表。或者更确切地说,甚至是一个单独的catagories表,以及一个将它们交叉链接到YourTable的表。

https://stackoverflow.com/a/7212980/1235298