Mysql sql m:n-join查询中的负筛选器
我想得到一个随机记录的一个表过滤的一些标准。 我在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. 项目4Mysql 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
不是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类的物品,即使它们拥有其他类别。