gpt4 book ai didi

mysql - 如何在 mysql 中的单独表上加入恰好一个匹配项?

转载 作者:行者123 更新时间:2023-11-29 14:35:40 26 4
gpt4 key购买 nike

我在使用 mysql 时遇到问题,您或许可以提供帮助。我有 2 个具有以下结构的表和几个示例行

TABLE 1
-------
LISTID NAME 10_OTHER_COLUMNS
---------------------------------------
1 List1
2 List2
3 List3

TABLE 2
-------
LISTID LISTTYPE(ENUM, 4 options)
------------------------------------------------
1 type1
1 type2
2 type3
3 type1
3 type2
3 type3

从表 1 到表 2 的关系是一对多。我想对表 1 进行选择,其中的行仅返回,并且仅当它们在表 2 上恰好有一个匹配时才返回。更好地解释,列表可以有不止一种类型,如果我简单地执行以下操作:

SELECT t1.*
FROM table_1 t1
LEFT JOIN table_2 t2 USING (listid)
WHERE t2.listtype = 'type3'

它返回List2List3。我想从结果中删除 List3,只保留 List2。有什么想法吗?

最佳答案

好吧,我想我明白了...您要求的是前:“type3”,需要澄清的英文描述是...

给我一​​份所有表的列表(即:ListID),这些表最多只有我正在查找的一个代码,没有其他代码,不与任何其他“类型”关联。

select 
t1.*
from
( select
t2.ListID,
count(*) as TotalTypesForTable,
sum( if( t2.type = 'type3', 1, 0 )) as TypeWanted
from
Table2 t2
group by
t2.ListID ) PreQuery

JOIN Table1 t1
on PreQuery.ListID = t1.ListID
where
PreQuery.TypeWanted = 1
AND PreQuery.TotalTypesForTable = 1

反馈选项...

根据您对几百万条记录的评论,我会以这种方式调整它,总体上也可能会更快。

select 
t1.*
from
Table2 t2Required

LEFT JOIN Table2 as t2Extra
on t2Required.ListID = t2Extra.ListID
AND NOT t2Extra.type = 'type3'

JOIN Table1 t1
on t2Required.ListID = t1.ListID
where
t2Required.type = 'type3'
and t2Extra.ListID IS NULL

我还想知道第二个的性能差异。第二种方法实际上是基于有意预期的“不要找到我”,但不需要子选择。通过使用相同的 ID 将 table2 与其自身连接起来,但使用与我们要查找的类型不同的“任何其他”类型,我们想要的唯一一个是我们在 t2Extra 实例中找不到的条目。然后,从 t1 获取表名...

关于mysql - 如何在 mysql 中的单独表上加入恰好一个匹配项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9122531/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com