mysql - 需要在 mysql 数据库中查询所需的输出

标签 mysql database

我有两个表 ITEM 和 CONDITION,其数据库结构如下

ITEM => 
    ID - INTEGER
    ITEM_NAME - VARCHAR

CONDITION => 
    CID - INTEGER
    COND_NAME  - VARCHAR
    ITEM_ARRAY - VARCHAR (Stores all ITEM ID's separated by space 
                      like: 1 5 9 17 18

CID  COND_NAME  IEM_ARRAY

1    C1         1 5 9

2    C2         9 17 18

3    C3         3 7 11 

在我的前端站点应用程序中,我们提供了一个选项,用户可以选择一个或多个项目,基于此我们必须列出建议的项目

为此,我们创建了一个列 ITEM_ARRAY,它保存由数组分隔的相关 ITEMS 的信息。

我需要一个查询来根据 CONDITION 表的相关 ITEMS 列出 ITEM 表中的所有 ITEM_NAME。例如,如果用户选择 1 和 9,那么我们必须显示 ITEM ID(5 17 18)及其相应的 ITEM NAME。像这样。

ID |  ITEM_NAME
---+-----------
5  |  SOME ITEM1
17 |  SOME ITEM2
18 |  SOME ITEM3

我尝试编写查询

SELECT SUBSTRING(s.ITEM,2, LENGTH(s.ITEM)) 
FROM ( SELECT REPLACE(ITEM_ARRAY," ",",") as ITEM 
       FROM `CONDITION` 
       WHERE ITEM like "% 1 5 %") s 

如果用户选择 1 和 5,上面的查询会显示 CONDITION 表中所有相关 ITEM_ARRAY 的列表。但是如果用户选择一些不同的值,例如 1,9 或 1,17,18 种 ITEMS,那么我的查询将无法列出相关项目。

我怎样才能获得所有相关的值。我们可以自由地对表结构进行一些更改,而无需数据冗余。

请提出您宝贵的建议来解决该问题。如果任何其他概念(例如触发器)可以帮助我们,请指导我。

最佳答案

我认为您最好的选择是重新设计CONDITION 表,以便它不会在单个 ITEM ARRAY 中包含所有 ITEM ID - 您应该为每个 ITEM ID 一行。在这种情况下,您应该稍微规范化数据,例如:

CREATE TABLE cond (
 CID INT PRIMARY KEY AUTO_INCREMENT,
 COND_NAME VARCHAR(128));

CREATE TABLE condition_items (
 CID INT,
 ITEM_ID INT);

INSERT INTO cond VALUES (1,'C1');
INSERT INTO condition_items VALUES (1,1),(1,5),(1,9);

INSERT INTO cond VALUES(2,'C2');
INSERT INTO condition_items VALUES (2,9),(2,17),(2,18);

如果您使用 InnoDB,那么您可以使用外键来强制完整性:

ALTER TABLE condition_items ADD FOREIGN KEY (CID) REFERENCES cond (CID);

这将允许在表之间执行非常简单的 JOIN。

SELECT item_id,item_name 
 FROM cond 
 JOIN condition_items USING (CID) 
 JOIN item ON (item.id=condition_items.item_id) 
 WHERE cond_name="C2";

请注意,您应该避免使用 CONDITION 作为表名,因为它是保留字。

关于mysql - 需要在 mysql 数据库中查询所需的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24423840/

相关文章:

php - 基于以前改进的 MySQL 查询从 MySQL 中选择

c# - 将解决方案拆分为不同项目后出现组装错误

c# - Nhibernate 标准 : Use of Expression. in()

database - 更新数据库后如何更新redis?

database - Microsoft Access 列显示

mysql - 使用未使用的主键

mysql - 使用 SQL 触发器设置日期时间列

mysql 将同一行上的 2 个时间戳列与搜索范围进行比较

regex - 生成基于正则表达式的字符串的所有可能组合的列表

mysql - 从数据库获取最后一条记录的有效方法