到目前为止,我已经尝试过这种方法,该方法似乎正在获取我想要的所有行,除了我正在执行REGEXP的那部分

SELECT p.id
FROM package AS p
    LEFT JOIN myservice AS s ON s.package = p.id
WHERE s.category IN (17,7,13,3,4,60,8)
GROUP BY p.id
HAVING GROUP_CONCAT(s.category) REGEXP 17|7|13|3|4|60|8


如果我在正则表达式后仅用一个数字来执行此操作,它将正确返回包含17的所有行,但是当我用|添加另一个值时它停止工作。

我做错了什么,也许有使用Eloquent的更好的方法吗?

最佳答案

首先:正则表达式不适合SQL选择器,这是不能普遍支持它们的原因之一。它们很慢,不允许使用索引,并且很难“正确设置”,例如“ 8”将匹配8、18、81、28、82、128、182等。

例如只要您只有几个,GROUP_CONCAT(s.category) REGEXP "17"将只匹配类别17,但是当您拥有170+类别时,它也会匹配170、171,...。

现在您的问题:如果我没看错,则您有s.category IN (17,7,13,3,4,60,8)的(正确)选择器,但是由于它是左联接,因此您也会得到NULL值并希望将其过滤掉。只需检查s.category IS NOT NULL即可轻松完成。

关于mysql - 我如何从原始Msql或Eloquent的LEFT JOINS中获取所有包含在group_concat()中逗号值的表?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57088527/

10-14 15:01