MySQL从一对多关系中过滤结果。

问题描述 投票:0回答:1

我有两张桌子。quotes_tableflags_table. 该 quotes_table 具有一对多的关系。flags_table - 每个引用可以有多个标志。flags_table.id_flag 是一个外键的 quotes_table.id_flag.

示例输入

报价表

pk | quote_key   | id_flag
--------------------------
1  | 111         | 200
2  | 222         | 251
3  | 111         | 250

旗帜表

id_flag | name
---------------
200 | testing
251 | converted
250 | paid

预期产出

quote_key | id_flag | name
-------------------------------------
222       | 251     | converted

总而言之,我试图返回所有没有 "测试 "标志的引号,即使有其他标志存在。

我目前的查询仍然返回 quote_key 记录111,因为 left join 但我不知道如何 "过滤 "出来。

当前查询

SELECT q.quote_key, q.id_flag, f.name FROM quotes_table AS q
LEFT JOIN flags_table AS f ON q.id_flag = f.id_flag
WHERE  f.name != "testing"

示例图 quotes_tableflags_table:Diagram showing relationship between quote and flag tables.

执行结果 LEFT JOIN 之间 quotes_tableflags_table.LEFT JOIN Result between quotes and flags table

红色的行代表了一个引号,请注意共享的。quote_key. 所以我试图从我的结果中扔掉红色的条目,以便我只得到没有 "测试 "标志的引号。

SQL Fiddle示例

mysql sql one-to-many
1个回答
1
投票

希望对大家有所帮助。

SELECT q.quote_key, q.id_flag, f.name FROM quotes_table AS q
INNER JOIN flags_table AS f ON q.id_flag = f.id_flag
WHERE f.name != "Testing"
AND q.quote_key not in (select quote_key from quotes_table q1, flags_table f1 
where q1.id_flag = f1.id_flag and f1.name = 'Testing')
© www.soinside.com 2019 - 2024. All rights reserved.