我有两个表 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/