【问题标题】:Most efficient way to perform query执行查询的最有效方式
【发布时间】:2016-05-10 12:55:05
【问题描述】:

我的目标是从外键值与另一个表的子查询返回的 ID 匹配的表中获取所有记录。

我尝试了几种组合,但它们甚至都无法编译。

为了澄清,请考虑以下查询:

SELECT *
FROM   `news`
WHERE  IDFIRM IN (SELECT ID FROM firm WHERE Block=0)
AND    Actual=1

这是一个简单的查询,但除了这个子查询中的ID,我还需要检索其他列并返回它们作为响应。

类似这样的东西(但当然这是行不通的):

SELECT news.*, sub.name
FROM   `news`,
       (SELECT * FROM firm WHERE Block=0) AS sub
WHERE  news.IDFIRM IN (SELECT sub.ID FROM sub)
AND    news.Actual=1

我知道如何使用连接来实现这一点,但问题是可以有多个 IN 语句(来自不同的表),如下所示:

SELECT *
FROM   `news`
WHERE  IDFIRM IN (SELECT ID FROM firm WHERE Block=0)
AND    Actual=1
AND    id_publisher IN (SELECT ID FROM publisher WHERE Block=0)

因此,根据请求的不同,此查询可能会变得非常不同。

如何创建最有效的查询来解决此任务?或者只有多个查询才有可能?

谢谢。

【问题讨论】:

标签: php mysql sql database join


【解决方案1】:

您已经在建议加入。 你可以使用多个 JOIN 来得到你想要的。

SELECT * FROM news
JOIN firm ON IDFIRM = firm.ID
WHERE Block = 0
JOIN publisher ON id_publisher = publisher.ID
WHERE Block = 0

我是凭记忆这样做的,但我认为应该让你接近。

【讨论】:

    【解决方案2】:

    假设您的索引在JOIN 的两侧都正常,它们实际上会被利用,而子查询可能使用一侧。

    SELECT [column_list]
    FROM news n
      INNER JOIN firm f
        ON n.idfirm = f.id
      INNER JOIN publisher p
        ON n.idpublisher = p.id
    WHERE n.actual = 1
      AND f.block = 0
      AND p.block = 0
    

    【讨论】:

      【解决方案3】:

      您绝对应该使用JOIN 而不是IN (SELECT ...)

      查询 1:

      SELECT *
      FROM   `news`
      WHERE  IDFIRM IN (SELECT ID FROM firm WHERE Block=0)
      AND    Actual=1
      

      替换为:

      SELECT     news.*
      FROM       news
      INNER JOIN form ON news.IDFIRM = form.ID
      WHERE      news.Actual=1
      

      查询 2:

      SELECT news.*, sub.name
      FROM   `news`,
             (SELECT * FROM firm WHERE Block=0) AS sub
      WHERE  news.IDFIRM IN (SELECT sub.ID FROM sub)
      AND    news.Actual=1
      

      替换为:

      SELECT     news.*,
                 firm.name
      FROM       news
      INNER JOIN firm ON news.IDFIRM = firm.ID 
      WHERE      news.Actual=1
      AND        firm.Block=0
      

      查询 3:

      SELECT *
      FROM   `news`
      WHERE  IDFIRM IN (SELECT ID FROM firm WHERE Block=0)
      AND    Actual=1
      AND    id_publisher IN (SELECT ID FROM publisher WHERE Block=0)
      

      替换为:

      SELECT     news.*
      FROM       news
      INNER JOIN firm      ON news.IDFIRM = firm.ID
      INNER JOIN publisher ON news.id_publisher = publisher.ID
      WHERE      news.Actual=1
      AND        firm.Block=0
      AND        publisher.Block=0
      

      添加表格和条件

      所以想法是你添加所有你需要的表,像这样的子句:

      INNER JOIN table1 ON news.<foreign-key> = table1.ID
      

      并且您在WHEREclause 中添加所有条件,如下所示:

      WHERE   table1.field = <literal>
      AND     table2.field = <other literal>
      AND     ...
      

      【讨论】:

      • 感谢您的完整回答,非常感谢。
      猜你喜欢
      • 2016-06-06
      • 2014-10-20
      • 2013-08-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-16
      • 2012-03-29
      相关资源
      最近更新 更多