【问题标题】:SELECT multiple queries with multiple where clause使用多个 where 子句选择多个查询
【发布时间】:2019-10-25 03:39:17
【问题描述】:

我有两个选择查询要结合起来以获得更快的性能。我有点困惑,因为我不确定是否可以使用 JOINLEFT JOIN 或其他东西来加快速度。

这是我要合并的两个查询:

查询 1:

SELECT id FROM users WHERE email = :email LIMIT 1

然后,如果查询 1 中存在该行,则运行查询 2:

SELECT * FROM settings WHERE id = :id_from_query_1

感谢您的任何帮助!

【问题讨论】:

  • 你要进一步说明你的情况;您的表格是否有任何关系,您必须澄清这一点,并明确说明您所做的事情是否已经不起作用,或者它是否只是您想要优化性能
  • emailusers 表中是唯一的吗?

标签: php mysql performance join select


【解决方案1】:

创建join query 时,您可以指定要加入的列。在这种情况下,它将是:

select users.id, settings.*
from users
join settings on users.id = settings.id

您还可以使用双 from 子句,我认为这会导致与背景相同的速度,如下所示:

select users.id, settings.*
from users, settings
where users.id = settings.id

如果设置了正确的索引,则连接应该快于 2 次选择。当然,速度方面有很多因素,例如负载、网络、缓存的内容和未缓存的内容等。

【讨论】:

    【解决方案2】:

    根据您的描述,加入应该可以工作。 也许是这样的:

    select u.id, s.* from users as u join settings as s on u.id = s.id where email = ?;
    

    【讨论】:

      【解决方案3】:

      由于第一个子查询将返回 1 行(或无):

      SELECT * FROM settings 
      WHERE id = (SELECT id FROM users WHERE email = :email LIMIT 1)
      

      【讨论】:

      • 这应该准确返回 OP 通过两个查询得到的结果。而且由于我们不知道,如果email 是唯一的 - 这是迄今为止唯一准确的答案。尽管settings.id 引用users.id 看起来很可疑。但这是 OP 的问题。
      • 虽然 settings.id 引用 users.id 看起来很可疑 正确!也许是错字?应该是 user_id 之类的吗?
      【解决方案4】:
      Select s.* from settings s left join users u
      ON u.id = s.id
      Where email = :email
      LIMIT 1;
      

      这将返回设置表中具有相应“电子邮件”的特定 ID 的所有列。

      【讨论】:

        【解决方案5】:
        SELECT u.id 
        FROM users u
        WHERE email = :email 
        LEFT JOIN settings s 
        ON u.id = s.id
        LIMIT 1
        

        这是给你的左连接查询。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-07-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-06-10
          • 1970-01-01
          相关资源
          最近更新 更多