Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql sql m:n-join查询中的负筛选器_Mysql_Sql_Join_Mariadb - Fatal编程技术网

Mysql sql m:n-join查询中的负筛选器

Mysql sql m:n-join查询中的负筛选器,mysql,sql,join,mariadb,Mysql,Sql,Join,Mariadb,我想得到一个随机记录的一个表过滤的一些标准。 我在MariaDB中有3个表项目、类别、项目\类别: 该项目应属于第1类,但不属于第2类,也不属于第3类 挑选* 从项目 左连接项目\类别 ON item.id=item\u category.item\u id 其中item_category.item_id不在2,3中 结果包括项目1,因为它同时属于类别1和类别2。我的错误是什么?正确的sql查询是什么 在我的简化表格结构下面: 项目: 身份证件 名称 1. 项目1 2. 项目2 3. 项目3 4

我想得到一个随机记录的一个表过滤的一些标准。 我在MariaDB中有3个表项目、类别、项目\类别:

该项目应属于第1类,但不属于第2类,也不属于第3类

挑选* 从项目 左连接项目\类别 ON item.id=item\u category.item\u id 其中item_category.item_id不在2,3中 结果包括项目1,因为它同时属于类别1和类别2。我的错误是什么?正确的sql查询是什么

在我的简化表格结构下面:

项目:

身份证件 名称 1. 项目1 2. 项目2 3. 项目3 4. 项目4
不是2,3中的项目\类别。项目\ id不是2,3中的项目\类别。类别\ id不是2,3中的吗?请尝试内部联接而不是左联接

SELECT *
FROM item 
inner JOIN item_category 
ON item.id = item_category.item_id
WHERE item_category.item_id NOT IN (2,3)

由于每个项目有多个类别,我会考虑使用子查询。如果我理解正确。。。您希望按类别筛选项目,筛选类别中的每个项目都不应出现

这可以通过以下方式实现:

SELECT *
FROM item 
LEFT JOIN item_category 
ON item.id = item_category.item_id
WHERE item_category.item_id NOT IN(
SELECT DISTINCT item
 FROM item_category
 WHERE category IN (2,3))

这是否足够简单和合乎逻辑

SELECT item.* 
    FROM item
    WHERE     EXISTS( SELECT 1 FROM ic WHERE item_id = i.item_id AND cat_id IN (1)   )
      AND NOT EXISTS( SELECT 1 FROM ic WHERE item_id = i.item_id AND cat_id IN (2,3) );
这可能会更有效率:

SELECT item.* 
    FROM item
    JOIN ic USING(user_id)
    WHERE ic.cat_id = 1
      AND NOT EXISTS( SELECT 1 FROM ic WHERE item_id = i.item_id AND cat_id IN (2,3) );

其他解决方案在尝试表述2或3时存在问题,因为它不等于2或3。

抱歉,但我不理解你的批评:我提供了一个示例,说明了我所做的事情、我试图实现的事情以及根据我在问题中发布的SQL查询所发生的事情。这有什么不对?大概随机结果总是第2项,因为这是唯一符合规定标准的项目,所以问题不在于结果应该只包含一个随机项目,而在于过滤器没有按照我预期的方式工作。问题在于你没有充分解释这个问题。这是一个内部连接,不完全是。如果我们使用内部联接,由于有2个类别,输出仍然包含项1。如果我理解正确的话,他不想要第2类和第3类的物品,即使它们拥有其他类别。