我在MySQL中有两个表,一个是产品,另一个是排除。我必须选择表products
中不存在于表exclusions
中的所有产品。当通过"直接"进行排除时,我取得了成功。字段等价,即产品的参考代码。
但许多产品可以通过模式排除。它由参考代码的最后3位数字组成。因此,如果我有值" ++ 6",则表示该序列的第三个数字,即参考代码的最后一个数字,必须与6不同。如果是6,那么该产品被排除在外。我在这里被卡住了。我应该使用什么正则表达式? 该模式可以完全是' 0 + 6',' 036'等。
我粘贴示例表的结构和数据,以及与引用一起使用的SELECT。问题是改变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代码正在运行
SELECT * FROM products AS p LEFT JOIN exclusions AS e ON p.reference = e.reference WHERE e.reference IS NULL
结果:
id_products, reference, id_exclusions, reference, pattern
1, 8034, NULL, NULL, NULL
2, 8035, NULL, NULL, NULL
使用更正后的SELECT,它应该只返回
id_products, reference, id_exclusions, reference, pattern
1, 8034, NULL, NULL, NULL
作为' xx5'参考代码被排除在外。
答案 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