基于列中逗号分隔的值从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();