2016-06-17 16 views
1

MySQLには2つのテーブルがあり、それ以外は除外されています。テーブルのテーブルexclusionsにない商品をすべて選択する必要があります。除外が「直接的な」フィールド等価、すなわち製品の参照コードを通じて行われるとき、私は成功しました。MySQL検索の正規表現

しかし、多くの製品はパターンで除外できます。これは、参照コードの最後の3桁で構成されます。したがって、値が「++ 6」の場合、そのシーケンスの第3桁、すなわち参照コードの最後の桁は6でなければならないことを意味する.6であれば、その製品は除外される。私が立ち往生している場所です。どのような正規表現や何かを使用する必要がありますか? パターンは完全に '0 + 6'、 '036'などになる可能性があります。

サンプルテーブルの構造とデータ、および参照と連動するSELECTを貼り付けます。問題は、 "pattern"で除外を説明できる正規表現(または何でも)を含むようにSELECTを変更することです。

CREATE TABLE IF NOT EXISTS `exclusions` (
    `id_exclusions` int(11) NOT NULL AUTO_INCREMENT, 
    `reference` varchar(10) NOT NULL, 
    `pattern` varchar(3) NOT NULL, 
    PRIMARY KEY (`id_exclusions`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=3 ; 

INSERT INTO `exclusions` (`id_exclusions`, `reference`, `pattern`) VALUES 
(1, '8036', ''), 
(2, '', '++5'); 

    CREATE TABLE IF NOT EXISTS `products` (
    `id_products` int(11) NOT NULL AUTO_INCREMENT, 
    `reference` varchar(10) NOT NULL, 
    PRIMARY KEY (`id_products`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=4 ; 

INSERT INTO `products` (`id_products`, `reference`) VALUES 
    (1, '8034'), 
    (2, '8035'), 
     (3, '8036'); 

今現在

SELECT * FROM products AS p LEFT JOIN exclusions AS e ON p.reference = e.reference WHERE e.reference IS NULL 

結果作業SELECTコード:修正SELECTで

id_products, reference, id_exclusions, reference, pattern 
    1, 8034, NULL, NULL, NULL 
    2, 8035, NULL, NULL, NULL 

は、それだけで 'XX5' として

id_products, reference, id_exclusions, reference, pattern 
    1, 8034, NULL, NULL, NULL 

を返す必要があります参照コードは除外されます。

+0

結果はOKです!!。テーブル製品には3行あり、参照(8036)との一致は** ** 1つだけなので、他の2つの行が表示されます** "WHERE e.reference IS NULL" ** –

+0

製品コード?それは文字列の任意の長さを考慮する必要がありますか? xx5をmysqlの正規表現に変換する必要がありますか、それともバックエンドで行うことはできますか? –

+0

あなたは異なるデータを持つあなたのテーブルの出力が何であるかもっと多くのサンプルを投稿していただけますか –

答えて

1

で最後のSQLは非常に簡単だった:

SELECT * FROM products AS p WHERE id_products NOT IN 
(SELECT id_products FROM exclusions AS e LEFT JOIN 
    products AS p ON p.reference = e.reference WHERE p.id_products IS NOT NULL) 
AND id_products NOT IN 
(SELECT id_products FROM exclusions AS e LEFT JOIN 
products AS p ON SUBSTRING(p.reference, -3) 
LIKE REPLACE(pattern, '+', '%') 
WHERE id_products IS NOT NULL) ORDER BY p.reference ASC 
+0

'not in 'は使わないでください。 '存在しない 'を使う。 ....(not in)は、(私の)部分のデータにnullが含まれていると、予期しない結果を引き起こします。それはあなたがSQLでプロになるまであなたのツールの胸からそれを削除することは恐ろしい練習であり、最高です。 – Drew