【问题标题】:Select over multiple tables MySQL选择多个表 MySQL
【发布时间】:2013-10-12 08:02:21
【问题描述】:

我有三个表'users'、'friends'、'friendsrequests'。

'Users' 包含 id、firstname 和 lastname,'friends' 和 'friendsrequests' 都包含 users_id_a 和 users_id_b。

当我搜索新朋友时,我选择 id's where firstname is LIKE :whatever 或 lastname LIKE :whatever。但是,我想排除其他两个表中存在的那些 id。

我知道如何通过应用程序逻辑来解决这个问题,但我也知道我不应该这样做。我知道我不应该链接 SELECT 语句并且应该使用连接。

【问题讨论】:

    标签: mysql


    【解决方案1】:

    您已经回答了自己的问题,因为您知道可以使用joins。这里有很多关于如何在 MySQL 中进行连接的示例。

    有多种连接类型,但在本例中您需要的连接类型可能是 LEFT OUTER。您可以使用IS NULL 对其他两个表上的字段进行过滤。因此,无论这些表中是否有任何数据,它都在加入附加表。使用 WHERE IS NULL 过滤掉那些存在的。

    您可以采用WHERE NOT EXISTS 方法,而不是使用连接。如果您不熟悉 SQL 连接,这种逻辑可能更适合您。 一个例子可能是:

    SELECT * FROM FRIENDS f
    WHERE NOT EXISTS (SELECT 1 FROM friendsrequests fr WHERE f.user_id = fr.user_id)
    

    可以在此处找到一些示例: SELECT * WHERE NOT EXISTS

    使用IN 语句或特别是WHERE NOT IN (SELECT ...) 的另一种方法

    如果您仍然无法在http://sqlfiddle.com/ 之类的网站上发布您的确切 sql 架构和要求,希望这将指导您,并且您更有可能得到更具体的回复。

    【讨论】:

    • 如您所知,我绝不是数据库专家,但我在某处读到不鼓励使用 SELECT ... WHERE NOT IN (SELECT...),因为这会很慢在大桌子上。这是真的吗?
    • 相比之下,我不会说它会“非常慢”。这取决于经验中的查询和表大小 - 在现实世界的大多数查询系统中,您很难注意到任何性能差异。请注意它。这是一篇比较三者的好文章。 explainextended.com/2009/09/18/…之所以提到不同的类型是为了更清楚地理解查询意图。
    猜你喜欢
    • 2013-11-08
    • 2011-02-26
    • 2013-01-25
    • 2010-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-13
    相关资源
    最近更新 更多