Php 执行查询的最有效方法

Php 执行查询的最有效方法,php,mysql,sql,database,join,Php,Mysql,Sql,Database,Join,我的目标是从外键值与另一个表的子查询返回的ID匹配的表中获取所有记录 我尝试了几种组合,但它们甚至无法编译 澄清,考虑以下查询: 挑选* 来自`新闻` 其中IDFIRM在从公司中选择ID,其中Block=0 和实际值=1 这是一个简单的查询,但是除了子查询中的ID之外,我还需要检索其他列并返回它们作为响应 类似这样的东西,但这当然不起作用: 选择新闻。*,子名称 从`新闻', 从块=0处选择*作为子块 其中news.IDFIRM位于“从子文件夹中选择子文件夹ID” 和新闻。实际值=1 我知道如何

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

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

澄清,考虑以下查询:

挑选* 来自`新闻` 其中IDFIRM在从公司中选择ID,其中Block=0 和实际值=1 这是一个简单的查询,但是除了子查询中的ID之外,我还需要检索其他列并返回它们作为响应

类似这样的东西,但这当然不起作用:

选择新闻。*,子名称 从`新闻', 从块=0处选择*作为子块 其中news.IDFIRM位于“从子文件夹中选择子文件夹ID” 和新闻。实际值=1 我知道如何使用联接实现这一点,但问题是不同表中可能有多个IN语句,如下所示:

挑选* 来自`新闻` 其中IDFIRM在从公司中选择ID,其中Block=0 和实际值=1 和id_publisher在SELECT id FROM publisher中,其中Block=0 因此,根据请求的不同,这个查询可能会变得非常不同

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


谢谢。

您已经在建议加入。 您可以使用多个连接来获得所需的内容

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

我是从内存中执行此操作的,但我想应该可以让您接近它。

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

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
您肯定应该使用“连接”而不是“选择…”

问题1: 挑选* 来自`新闻` 其中IDFIRM在从公司中选择ID,其中Block=0 和实际值=1 替换为:

选择新闻* 来自新闻 news.IDFIRM=form.ID上的内部联接表单 其中news.Actual=1 问题2: 选择新闻。*,子名称 从`新闻', 从块=0处选择*作为子块 其中news.IDFIRM位于“从子文件夹中选择子文件夹ID” 和新闻。实际值=1 替换为:

选择新闻。*, 公司名称 来自新闻 news.IDFIRM=firm.ID上的内部加入公司 其中news.Actual=1 和固定。块=0 问题3: 挑选* 来自`新闻` 其中IDFIRM在从公司中选择ID,其中Block=0 和实际值=1 和id_publisher在SELECT id FROM publisher中,其中Block=0 替换为:

选择新闻* 来自新闻 news.IDFIRM=firm.ID上的内部加入公司 news.id\u publisher=publisher.id上的内部加入publisher 其中news.Actual=1 和固定。块=0 和publisher.Block=0 添加表和条件 因此,您可以添加所有需要的表,其中包含以下子句:

新闻中的内部连接表1表1.1 在Where条款中添加所有条件,如下所示:

其中table1.1字段= 和表2.1字段= 和
桌子?柱?我们只能想象有多少种组合。如果你需要帮助,请说得更具体一些。谢谢你完整的回答,非常感谢。