我遇到了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'
返回 List2 和 List3 。我想从结果中删除 List3 ,只有 List2 。有什么想法吗?
答案 0 :(得分:1)
好吧,我认为我明白了......你要求的是:“type3”,一个澄清的英文描述将是......
给我一个列表,列出所有表格(即:ListID),AT MOST只有我正在寻找的一个代码,没有别的,与任何其他“类型”无关。
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
我也想知道第二个的性能差异。第二种方法实际上是基于预期的“找不到我”的意图,但不需要子选择。通过将table2连接到自己的相同ID,但是我们正在寻找的“任何其他”类型,我们想要的唯一一个是我们在t2Extra实例中找不到的条目。然后,从t1获取表名...