Php 执行查询的最有效方法
我的目标是从外键值与另一个表的子查询返回的ID匹配的表中获取所有记录 我尝试了几种组合,但它们甚至无法编译Php 执行查询的最有效方法,php,mysql,sql,database,join,Php,Mysql,Sql,Database,Join,我的目标是从外键值与另一个表的子查询返回的ID匹配的表中获取所有记录 我尝试了几种组合,但它们甚至无法编译 澄清,考虑以下查询: 挑选* 来自`新闻` 其中IDFIRM在从公司中选择ID,其中Block=0 和实际值=1 这是一个简单的查询,但是除了子查询中的ID之外,我还需要检索其他列并返回它们作为响应 类似这样的东西,但这当然不起作用: 选择新闻。*,子名称 从`新闻', 从块=0处选择*作为子块 其中news.IDFIRM位于“从子文件夹中选择子文件夹ID” 和新闻。实际值=1 我知道如何
澄清,考虑以下查询:
挑选* 来自`新闻` 其中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字段=
和
桌子?柱?我们只能想象有多少种组合。如果你需要帮助,请说得更具体一些。谢谢你完整的回答,非常感谢。