【问题标题】:mysql select a row only if a field at another row is equal tomysql仅在另一行的字段等于时才选择一行
【发布时间】:2010-09-01 19:59:16
【问题描述】:

我有这两张表:

tAccounts
id、名称、server_id

tFriends
id_lo, id_hi

现在,我正在尝试这个查询:

SELECT FR.id_lo AS id_friend
FROM tFriends FR, tAccounts AC
WHERE (FR.id_hi = 4 && AC.server_id != -1)

........为了得到某个用户的朋友,同时确保他朋友的server_id不是'-1'

有什么想法吗? WHERE 子句中的 'AC.server_id != -1' 约束似乎没有给我预期的结果。

【问题讨论】:

    标签: mysql select where-clause


    【解决方案1】:

    你在哪里加入条件?应该是这样的:(我假设 tFriends.id_lo 是朋友的帐户 ID)

    SELECT FR.id_lo AS id_friend
    FROM tFriends FR 
    INNER JOIN tAccounts AC ON (AC.id = FR.id_lo AND AC.server_id != -1)
    WHERE FR.id_hi = 4 ;
    

    【讨论】:

      【解决方案2】:

      您需要将两个表连接起来;否则,您将得到一个笛卡尔积(将 id_hi = 4 的 tFriends 的所有行与 server_id 不是 -1 的 tAccounts 的所有行结合起来)。

      试试这个:

      SELECT FR.id_lo AS id_friend
      FROM tFriends FR
      INNER JOIN tAccounts AC ON AC.id = FR.id_hi
      WHERE (FR.id_hi = 4 && AC.server_id != -1)
      

      【讨论】:

      • 我不确定要加入 id_lo 和 id_hi 中的哪一个,所以我只选择了一个。
      【解决方案3】:

      尝试加入帐户表两次:

      SELECT *
      FROM tAccounts a1
      JOIN tFriends f ON a1.id = f.id_lo
      JOIN tAccounts a2 ON a2.id = f.id_hi
      WHERE a1.id = 4 AND a2.server_id != -1
         OR a2.id = 4 AND a1.server_id != -1
      

      或使用 UNION:

      SELECT *
      FROM tAccounts a
      JOIN tFriends f ON a.id = f.id_lo
      WHERE f.id_hi = 4 AND a.server_id != -1
      UNION
      SELECT *
      FROM tAccounts a
      JOIN tFriends f ON a.id = f.id_hi
      WHERE f.id_lo = 4 AND a.server_id != -1
      

      【讨论】:

      • 谢谢马克,所以你是我唯一需要的。一个问题;在性能方面如何?我可能有 4-5 百万个友谊行和几十万个帐户。除了添加一个 memcached 框,如果我们只讨论 sql 语句;我怎样才能获得更好的性能? 'tFriends' 表上的 'server_id' 字段是否会节省大量 CPU,因为它会避免两个表的 JOIN?
      • @Poni:您需要添加 server_id_lo 和 server_id_hi。这将提高性能。获得良好性能的最佳方法是针对各种不同的查询/索引策略对其进行衡量,看看哪种方法效果最好。
      猜你喜欢
      • 2014-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-26
      • 1970-01-01
      • 2020-06-03
      • 2023-03-14
      • 1970-01-01
      相关资源
      最近更新 更多