1

我被困在实现这个 MySQL 查询的最佳方法上。

我有三张桌子:

产品- 这是产品列表

id | product_name

- 这是一个类别列表

id | category_name

cat_selected - 可以将多个类别分配给一个产品,此表列出了它们

cat_id | product_id

在搜索中,用户可以一次选择多个类别进行搜索。我想检查每个类别中是否存在一个产品,所以它需要匹配 cat_id 和 product_id。猫 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'
4

3 回答 3

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
于 2013-09-24T14:46:01.060 回答
0

这行得通吗?您的查询语法不正确。

SELECT *
FROM products
JOIN cats_selected
ON cats_selected.product_id = products.id
WHERE cats_selected.cat_id IN ('16372', '9')
于 2013-09-24T14:45:27.617 回答
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

添加了别名为的 GROUP_CONCAT 列cats,以防您需要知道与产品匹配的类别

于 2013-09-24T14:49:09.963 回答