Mysql 如何在SQL中使用IN运算符with和运算符IN WHERE子句。。。?

Mysql 如何在SQL中使用IN运算符with和运算符IN WHERE子句。。。?,mysql,sql,phpmyadmin,Mysql,Sql,Phpmyadmin,我在我的CodeIgniter模型中使用这个数据库查询 SELECT p.product_id, p.product_name, p.product_photo, p.size, p.price, p.status, p.product_image_path

我在我的CodeIgniter模型中使用这个数据库查询

SELECT
                p.product_id,
                p.product_name,
                p.product_photo,
                p.size,
                p.price,
                p.status,
                p.product_image_path
            FROM
                products AS p
            LEFT JOIN
                product_category AS pc
            ON
                p.product_id = pc.product_id
            LEFT JOIN
                vendor_products AS vp
            ON
                vp.product_id = pc.product_id
            WHERE
                pc.category_id = 2
            AND
                vp.vendor_id = 36
            AND 
                pc.subcategory_id IN (1,2)
            AND
                pc.subcategory_value_id IN (1,4)
它还给了我:

我只想要那些满足sub_category_value_id所有条件的产品。现在它返回所有条件


我是数据库新手,对查询不太了解。

似乎您不应该使用左连接到
产品类别
表。LEFT JOIN关键字返回左表中的所有记录(
product\u category
),请按如下方式尝试:

SELECT
                p.product_id,
                p.product_name,
                p.product_photo,
                p.size,
                p.price,
                p.status,
                p.product_image_path
            FROM
                products AS p
            INNER JOIN
                product_category AS pc
            ON
                p.product_id = pc.product_id
            LEFT JOIN
                vendor_products AS vp
            ON
                vp.product_id = pc.product_id
            WHERE
                pc.category_id = 2
            AND
                vp.vendor_id = 36
            AND 
                pc.subcategory_id IN (1,2)
            AND
                pc.subcategory_value_id IN (1,4)

您希望
分组,并且
拥有
。有点不清楚“所有条件”是什么意思,但看起来是这样的:

SELECT p.*
FROM products p JOIN
     product_category pc
     ON p.product_id = pc.product_id JOIN
     vendor_products AS vp
     ON vp.product_id = pc.product_id
WHERE pc.category_id = 2 AND
      vp.vendor_id = 36 AND
      (pc.subcategory_id, pc.subcategory_value_id) IN ( (1, 1), (2, 4) )
GROUP BY p.product_id  -- this is okay because it is presumably the primary key
HAVING COUNT(DISTINCT pc.subcategory_id) = 2;
注:

  • WHERE
    子句将
    左连接
    转换为
    内部连接
    ,因此使用右
    连接
  • 我假设您需要子类别表中的成对值
  • HAVING子句坚持两个子类别匹配

下面的查询将根据给定的供应商id、类别id、子类别id和子类别值id,为您提供具有产品id和产品名称的不同产品

让我知道这是否适合你

SELECT 
DISTINCT p.product_id,
p.product_name 
FROM products AS p
LEFT JOIN product_category AS pc ON p.product_id = pc.product_id
LEFT JOIN vendor_products AS vp ON p.product_id = vp.product_id
LEFT JOIN subcategories AS sc ON sc.subcategory_id = pc.subcategory_id
LEFT JOIN subcategories_value AS scv ON scv.subcategory_value_id = pc.subcategory_value_id
WHERE vp.vendor_id = 2 
    AND vp.category_id = 2 
    AND pc.subcategory_id IN (1, 2) 
    AND scv.subcategory_value_id IN (1, 4)
ORDER BY p.product_id;

where子句看起来没有问题,重复可能是由连接引起的。试着一次扔掉一个来测试。@OwlsSleeping其实这就是问题所在。我不知道怎么做。你提到了你得到的关系输出。什么是你期望得到的,而你不是?你唯一的问题是你看到的副本吗?@KyleWilliamson对不起,我发错问题了。我会更新它。你能检查一下吗?你能再解释一下你的问题吗?我不明白这个问题。您对类别和子类别的筛选不起作用?不是相反吗?LEFT JOIN返回所有产品,即使没有匹配的类别。HAVING COUNT(DISTINCT pc.subcategory_id)=2。。。。你能给我解释一下这句话吗。。。。??整个查询用于数据库,但我想将其添加为PHP查询以动态获取数据。@AkashRaut。它正在计算匹配子类别的数量并确保两者都匹配。很抱歉再次询问,但我应该为{pc.subcategory_id)=2}中的“2”声明什么。子类别\u id和子类别\u值\u id每次都会更改,即它可以是单个值,也可以是多个值,就像我们之前在查询中看到的那样。拥有COUNT没有返回所需的输出。@AkashRaut听起来不错。。快乐编码!