基于列中逗号分隔的值从MySQL表中获取记录
我正在从名为基于列中逗号分隔的值从MySQL表中获取记录,mysql,sql,codeigniter,Mysql,Sql,Codeigniter,我正在从名为Pizza\u table的表中提取记录 Pizza\u表Schema id | pizza name | pizza_topping_ids 1 | pizza1 |1,2,3 2 | pizza2 |2,3 3 | pizza3 |4,5,6 实际上,我的功能是基于pizza\u topping\u id 我在这方面有工作要做。但是我找不到合适的解决办法 我不能在子句中使用来获取记录 我尝试过: (一) 但是MySQL返回了一个空的结果集 如果逗号
Pizza\u table
的表中提取记录
Pizza\u表
Schema
id | pizza name | pizza_topping_ids
1 | pizza1 |1,2,3
2 | pizza2 |2,3
3 | pizza3 |4,5,6
实际上,我的功能是基于pizza\u topping\u id
我在这方面有工作要做。但是我找不到合适的解决办法
我不能在子句中使用来获取记录
我尝试过:
(一)
但是MySQL返回了一个空的结果集
如果逗号分隔的值与任何记录都不匹配,则返回在topping\u id
列中最有值的结果
例如:如果我运行了上面的查询,查找具有1,2,3,4顶饰id的比萨饼,但在数据库中不存在具有此类顶饰id组合的比萨饼,则结果将是覆盖最广的id,应显示为具有顶饰id 1,2,3
的“比萨饼1”
对不起,英语和格式都不好,但请试着理解我的问题。
提前谢谢
请帮帮我。试试这个-
SELECT * FROM `pizza_table` WHERE FIND_IN_SET(2,pizza_topping_id)
或REGEXP
SELECT * FROM `pizza_table` WHERE pizza_topping_id REGEXP '^2,|,2$|,2,' OR pizza_topping_id =2
请参阅演示:RegEx在非常大的数据集上运行缓慢
MySQL有一个。这可能不会直接回答您的问题,而只是一个建议:D
首先,表pizza\u topping
上的行不需要用逗号分隔。使用当前的设计很难搜索这样的值。值应存储在行中,而不是列中
考虑以下模式
CREATE TABLE PIZZA
(
PizzaID INT PRIMARY KEY,
NAME VARCHAR(50) UNIQUE,
PRICE DECIMAL(10,2)
);
INSERT INTO PIZZA VALUES (1,'Sunny Side Up Pizza', 120);
INSERT INTO PIZZA VALUES (2,'BBQ Chicken Pizza', 200);
INSERT INTO PIZZA VALUES (3,'Muffuletta Pizza', 175);
INSERT INTO PIZZA VALUES (4,'Caramelized Onion Pizza', 135);
INSERT INTO PIZZA VALUES (5,'Broccoli Deep Dish Pizza', 150);
CREATE TABLE TOPPINGS
(
ToppingID INT PRIMARY KEY,
NAME VARCHAR(50) UNIQUE
);
INSERT INTO TOPPINGS VALUES (1,'Pepperoni');
INSERT INTO TOPPINGS VALUES (2,'Mushroom');
INSERT INTO TOPPINGS VALUES (3,'Sausage');
INSERT INTO TOPPINGS VALUES (4,'Cheese');
INSERT INTO TOPPINGS VALUES (5,'Garlic');
INSERT INTO TOPPINGS VALUES (6,'Ham');
INSERT INTO TOPPINGS VALUES (7,'Tomato Sauce');
对于每个PizzaID
,PizzaID的ToppingID
记录应该有多行ToppingID
CREATE TABLE PIZZA_TOPPINGS
(
PizzaID INT,
ToppingID INT,
CONSTRAINT tb_fk1 FOREIGN KEY (PizzaID)
REFERENCES Pizza(PizzaID),
CONSTRAINT tb_fk2 FOREIGN KEY (ToppingID)
REFERENCES TOPPINGS(ToppingID),
CONSTRAINT tb_UQ UNIQUE (PizzaID, ToppingID)
);
INSERT INTO PIZZA_TOPPINGS VALUES (1,1);
INSERT INTO PIZZA_TOPPINGS VALUES (1,2);
INSERT INTO PIZZA_TOPPINGS VALUES (1,3);
INSERT INTO PIZZA_TOPPINGS VALUES (2,4);
INSERT INTO PIZZA_TOPPINGS VALUES (2,5);
INSERT INTO PIZZA_TOPPINGS VALUES (2,6);
INSERT INTO PIZZA_TOPPINGS VALUES (2,7);
INSERT INTO PIZZA_TOPPINGS VALUES (3,1);
INSERT INTO PIZZA_TOPPINGS VALUES (3,3);
INSERT INTO PIZZA_TOPPINGS VALUES (3,5);
INSERT INTO PIZZA_TOPPINGS VALUES (4,2);
INSERT INTO PIZZA_TOPPINGS VALUES (5,1);
INSERT INTO PIZZA_TOPPINGS VALUES (6,7);
INSERT INTO PIZZA_TOPPINGS VALUES (6,1);
这种搜索记录的技术叫做
例如,您希望搜索含有以下成分的比萨饼:意大利香肠
,蘑菇
,香肠
SELECT a.PIZZAID, a.NAME, a.PRICE
FROM Pizza a
INNER JOIN Pizza_Toppings b
ON a.PizzaID = b.PizzaID
INNER JOIN Toppings c
ON b.ToppingID = c.ToppingID
WHERE c.Name IN ('Pepperoni', 'Mushroom', 'Sausage')
GROUP BY a.PIZZAID, a.NAME, a.PRICE
HAVING COUNT(*) = 3
或者比萨饼是最起码的:辣香肠
,蘑菇
SELECT a.PIZZAID, a.NAME, a.PRICE
FROM Pizza a
INNER JOIN Pizza_Toppings b
ON a.PizzaID = b.PizzaID
INNER JOIN Toppings c
ON b.ToppingID = c.ToppingID
WHERE c.Name IN ('Pepperoni', 'Mushroom')
GROUP BY a.PIZZAID, a.NAME, a.PRICE
HAVING COUNT(*) = 2
这些函数比使用任何其他函数都要好得多,比如FIND\u IN_SET
,REGEXP
,等等。尝试在这种结构中使用mysql的FIND\u IN_SET
$id = 2;
$query = $this->db->query("
SELECT *
FROM `pizza_table`
WHERE FIND_IN_SET($id,pizza_topping_id)";
return $query->result();
在大多数情况下,但并非所有(不确定)情况下,在列中存储逗号分隔的值是一种糟糕的设计。使其正常化。在比萨饼和配料表上创建一个M-to-M关系。实际上,我已经为配料关系创建了一个单独的表,但也需要一对多关系。否则怎么可能?你们的桌子是什么?也许我可以帮助它修改:D
主要是1)比萨饼:比萨饼数据id、名称、价格等2)顶部:id、名称、描述等3)比萨饼顶部:id、比萨饼id、顶部id(多个顶部id由逗号分隔)。N我的问题是,我想根据多个topping_id搜索比萨饼,如果找不到topping_id组合,则返回具有最大覆盖topping_id的比萨饼记录。但是,如果我有多个topping_id,它可以工作吗?对不起,问了个愚蠢的问题。它如何适用于多组值,如1,2,3,4???@Rajnish:请查看演示链接,但演示是关于使用单个值查找记录的,我还需要更多。。若我使用一个值获取记录,那个么我的首选项是正则表达式。好啊请给我一个关于where条件下多个值的解决方案。
SELECT a.PIZZAID, a.NAME, a.PRICE
FROM Pizza a
INNER JOIN Pizza_Toppings b
ON a.PizzaID = b.PizzaID
INNER JOIN Toppings c
ON b.ToppingID = c.ToppingID
WHERE c.Name IN ('Pepperoni', 'Mushroom')
GROUP BY a.PIZZAID, a.NAME, a.PRICE
HAVING COUNT(*) = 2
$id = 2;
$query = $this->db->query("
SELECT *
FROM `pizza_table`
WHERE FIND_IN_SET($id,pizza_topping_id)";
return $query->result();