使用MySQL在连接表上应用过滤器

时间:2012-06-14 17:22:47

标签: mysql join filter

我在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'......

如何正确完成此查询?

提前致谢!

4 个答案:

答案 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)

select * from items i where not exists 
(select '' from genres gen where gen.item_id = i.id and gen.name in ('foo','pop') )

更短且更简单的查询。 内部查询检查关键字列表中的流派名称,如果返回no行,则选择外部查询的当前行 验证输出 at here

感谢Kyra ,我从sql小提琴中借用了他的模式。