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

のレコードには、 for eachPIZZA_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);

このようにレコードを検索する手法を関係分割と呼びます

たとえば、 、 、 の材料を含むピザを検索するとPepperoniMushroomますSausage

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 に答える