我陷入了实现此MySQL查询的最佳方式。
我有三张桌子:
产品 - 这是产品列表
id | product_name
猫 - 这是一个类别列表
id | category_name
cats_selected - 可以为产品分配多个类别,此表列出了这些类别
cat_id | product_id
在搜索中,用户可以选择多个类别一次搜索。我想检查每个类别中是否存在产品,因此需要匹配cat_id和product_id。 cat id是作为一个数组发布的。
查询此数据的最佳方法是什么?
例如,以下原因不明显:
SELECT *
FROM products
JOIN cats_selected
ON cats_selected.product_id = products.id
AND cats_selected.cat_id = '16372'
AND cats_selected.cat_id = '9'
答案 0 :(得分:2)
SELECT p.id
FROM products p
JOIN cats_selected s ON s.product_id = p.id
where s.cat_id in (16372, 9)
group by p.id
having count(distinct s.cat_id) = 2
答案 1 :(得分:0)
这有用吗?您的查询语法不正确。
SELECT *
FROM products
JOIN cats_selected
ON cats_selected.product_id = products.id
WHERE cats_selected.cat_id IN ('16372', '9')
答案 2 :(得分:0)
假设你的cat_id的数组看起来像[1,2,4,3,52]
,你可以使用IN函数,你需要在WHERE部分检查cats_selected.cat_id
$cat_ids = [1,2,4,3,52];
$catImplode = implode(",",$cat_ids);
$query = <<<END
SELECT products.*, GROUP_CONCAT(cats_selected.cat_id) as cats
FROM products
JOIN cats_selected
ON cats_selected.product_id = products.id
WHERE cats_selected.cat_id IN ($catImplode)
GROUP BY products.id
END;
最终会出现$ query:
SELECT products.*, GROUP_CONCAT(cats_selected.cat_id) as cats
FROM products
JOIN cats_selected
ON cats_selected.product_id = products.id
WHERE cats_selected.cat_id IN (1,2,4,3,52)
GROUP BY products.id
添加别名为cats
的GROUP_CONCAT列,以防您需要知道产品匹配的类别