2016-08-31 32 views
0

我有点新加入,所以我甚至不确定这是否可能。我一直在谷歌上搜索并尝试一些东西..将MySQL不存在转换为INNER JOIN

我需要什么:

选择data.id其中相应的user2data.user_id不存在其中user2data.user_id =“X”

令人兴奋的权利? :d

什么工作:

SELECT * FROM data WHERE NOT EXISTS (SELECT * FROM user2data WHERE user2data.user_id=1 AND user2data.data_id=data.id) LIMIT 100; 

但是,它的速度慢,即使所有3列索引。我从另一个SO回答中尝试了一个OUTER JOIN用于此目的,但它比上述更甚。我需要的是一个INNER JOIN。

请让我知道这是否实际上是可能的,或者如果有替代方案利用索引。

感谢和最诚挚

+1

我建议一个*复合*'上超过user2data''(USER_ID,data_id)'指数。 – eggyal

+0

您不能对不存在的数据进行内部连接。 – shawnt00

+0

确保您加入的列已编入索引,然后外连接应快速。 – Barmar

回答

0

可能是你可以使用左连接

SELECT * 
FROM data WHERE 
LEFT JOIN user2data ON ( user2data.user_id=1 AND user2data.data_id=data.id) 
where user2data.data_id is null 
LIMIT 100; 
+0

他说他试过这个:*我为此尝试了一个OUTER JOIN * – Barmar

+0

@Barmar你知道我同意OP提到使用外连接。但是我也想知道OP是否提出了上面使用的正确的连接条件。 – shawnt00

+0

他说他从另一个SO答案中得到了答案。关于如何获取不匹配另一个表的所有行的问题有很多,例如, http://stackoverflow.com/questions/21633115/return-row-only-if-value-doesnt-exist?lq=1 – Barmar