MySQL数据必须存在于两列中才能返回

时间:2013-09-24 14:41:59

标签: php mysql

我陷入了实现此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'

3 个答案:

答案 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列,以防您需要知道产品匹配的类别