我在MySQL中存储了一些数据,并希望过滤掉符合给定条件的行。
听起来很简单,但不是因为涉及一些加入标准。
我有以下表格:
items : id, ...
genres: id, name:varchar, item_id
每个项目都有多种类型。
如果至少有一个类型与给定的流派名称(或一组名称)匹配,则查询应过滤 out 项目。
例如:
Item with id 1 has 3 genres
- genre name = 'foo'
- genre name = 'bar'
- genre name = 'baz'
如果给定的流派名称是'bar',['bar','baz','xyz']等,则第1项可能不是结果集的一部分。
我试图在项目上加入类型并使用“genres.name NOT IN(?)”应用WHERE语句。 ?是给定的一组流派名称。
这(当然)仅适用于只有一种类型的项目。多个WHERE条件也可以实现相同的目的:WHERE name<> 'a'和名称<> 'b'......
如何正确完成此查询?
提前致谢!
答案 0 :(得分:1)
您可以执行以下操作(see sqlfiddle):
select i.name as item, g.name as genre
from items as i
left join genres as g
on i.id = g.item_id
where i.id not in
(select distinct g2.item_id from genres as g2
where FIND_IN_SET(g2.name,'foo,bar'));
如果你想要检查多个类型名称,这种方式就可以了。
答案 1 :(得分:0)
您可以使用相关子查询 示例:
SELECT id
FROM items i
WHERE NOT EXISTS (SELECT 1
FROM genres g
WHERE g.`name` = 'bar'
AND i.id = g.item_id);
相关子查询与其他子查询的不同之处在于它引用外部查询 对外部查询投影/选择的每一行运行相关子查询。
答案 2 :(得分:0)
希望我明白你的要求,我认为MySQL和T-SQL在这方面会有所相似之处。这些是我假设您在示例中使用的示例表。
Table1
ID NAME
1 Item 1
2 Item 2
3 Item 3
4 Item 4
5 Item 5
6 Item 6
Table2
ID NAME ITEM_ID
1 Genre 1 1
2 Genre 2 1
3 Genre 3 1
4 Genre 1 2
5 Genre 2 2
6 Genre 3 2
7 Genre 1 3
8 Genre 2 3
9 Genre 3 3
10 Genre 1 4
如果符合您的某个条件,则以下是过滤 out 项目的SQL。
SELECT *
FROM table1 a, table2 b
WHERE a.id = b.item_id
AND b.name NOT IN ('Genre 1', 'Genre 2')
上述查询从样本表返回的结果。
ID NAME ID_1 NAME_1 ITEM_ID
1 Item 1 3 Genre 3 1
2 Item 2 6 Genre 3 2
3 Item 3 9 Genre 3 3
你也可以过滤掉genre_id(table2.id)。如果您打算使用子查询而不是硬编码值,那么您应该切换" NOT IN"一个" NOT EXISTS"并重写" AND"相应部分为" NOT IN"不喜欢空值。
此查询还假设每个"项目"至少有1"类型。"如果你想要所有"项目"我相信你可以玩它。不包括符合您标准的那些。
答案 3 :(得分:0)