一个更好的方法来执行多对多查询,但是从一个表中获取值的范围?

问题描述 投票:0回答:1

寻找提高效率的最佳方法。我正在尝试创建多个查询,但在这种情况下,我需要从类别表中收集多个值,然后查找包含这些类别的所有项目,然后获取与其表中的完整信息匹配的项目。 (使用具有类别表左侧值的嵌套集)。

  1. 获取类别节点的ID并获得左侧的值。 $sql = 'SELECT * FROM `categories_main`' . ' WHERE `id`=:id';
  2. 使用上面找到的左侧值查找在该范围内具有正确值的所有类别(所有子类别) $sql = 'SELECT `id`' 。 '来自categories_main'。 '在哪里lft> =:lft和rgt <=:rgt';
  3. 在链接表中查找属于上面找到的类别之一的项目ID。 $inQuery = implode(',', array_fill(0, count($category_ids), '?')); $sql = 'SELECT project_id, cat_id' 。 'FROM project_sites_categories_main'。 'WHERE cat_id IN('。$ inQuery。')';

4.然后我拿出项目ID,实际上从他们的表中获得项目的完整项目。

    $inQuery = implode(',', array_fill(0, count($project_ids), '?'));
    $sql = 'SELECT * '
. ' FROM project_sites'
. ' WHERE id IN(' . $inQuery . ')';

任何方向都会很棒。我发现了一些教程和线程涉及到很多,但我似乎无法弄清楚如何使一个值的工作从表中获取来自另一个的链接文件。

非常感谢你提前帮助。我希望这是足够的信息。

sql many-to-many
1个回答
1
投票

它与你的查询真的没什么不同,但我认为使用exists而不是in not static值更好。

select * from project_sites  
    where id EXISTS  (select project_id from project_sites_categories_main 
                                    where cat_id EXISTS  (select id from categories_main 
                                                               where lft >= :lft and <= :rgt)

PS:如果你想提高性能,你的查询不会使用select *只是写你需要的列。

© www.soinside.com 2019 - 2024. All rights reserved.