2

我从名为 的表中获取记录Pizza_Table

Pizza_table架构

id | pizza name | pizza_topping_ids
1  | pizza1     |1,2,3
2  | pizza2     |2,3
3  | pizza3     |4,5,6

实际上,我的功能是根据pizza_topping_ids 我在此搜索中分配的工作来搜索披萨。但我找不到合适的解决方案。.

我不能使用IN子句来获取记录。

我试过了:

1)

 SELECT * 
 FROM `pizza_table` 
 WHERE `pizza_topping_id` REGEXP '[[:<:]]2[[:>:]]'

问题:获取所有有价值的记录2

2)

SELECT * 
FROM `pizza_table` 
WHERE `pizza_topping_id` REGEXP '[[:<:]]1,2,3,4[[:>:]]' 

但是 MySQL 返回了一个空的结果集,

如果逗号分隔的值与任何记录都不匹配,则返回topping_id列中最有价值的结果。

例如:如果我已经运行了上面的查询以找出具有 1、2、3、4 topping_id 的比萨饼,但是在数据库中不存在具有这样的 topping_id 组合的比萨饼,那么结果将是最覆盖的 id 应该显示为 'pizza1' pizza_topping_id 1,2,3

抱歉英语和格式不好,但请尝试理解我的问题。提前致谢。

请帮我。

4

4 回答 4

3

试试这个-

SELECT * FROM `pizza_table` WHERE  FIND_IN_SET(2,pizza_topping_id)

或正则表达式

SELECT * FROM `pizza_table` WHERE pizza_topping_id REGEXP '^2,|,2$|,2,' OR pizza_topping_id =2

请看演示:演示

于 2013-01-18T15:18:58.590 回答
2

RegEx 在非常大的数据集上速度很慢。

MySQL 有一个FIND_IN_SET(value, column).

于 2013-01-18T15:19:10.127 回答
2

这可能不会直接回答您的问题,而只是一个建议:D

首先,表上的行pizza_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');

并且每个的记录PIZZA_TOPPING应该有多行。ToppingIDPizzaID

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);

这种搜索记录的技术称为关系除法

例如,您想搜索具有以下成分的比萨饼:PepperoniMushroomSausage

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

或至少包含以下内容的比萨饼:Pepperoni, Mushroom,

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_IN_SET,REGEXP等)要好得多。

于 2013-01-18T17:00:51.493 回答
0

尝试在这种结构中有用的mysql的find_in_set

$id = 2;
$query = $this->db->query("
                         SELECT * 
                         FROM `pizza_table` 
                         WHERE FIND_IN_SET($id,pizza_topping_id)";
return $query->result();
于 2013-01-18T19:51:54.087 回答