基于两个没有连接的表查询结果

query with result based on two tables without join

我想在 Query Builder 中创建查询 查询至少应该看起来像(加上隐藏、删除的默认拼写错误字段等):


    SELECT DISTINCT
        *
    FROM
        domain_model_topic,
        domain_model_post
    WHERE
        domain_model_topic.uid = domain_model_post.topic
            AND (domain_model_topic.title LIKE '%test%'
            OR domain_model_post.text LIKE '%test%')

查询用于在论坛中搜索 selected word 在此查询中,我有一个来自用户的变量:要在主题中搜索的文本和 posts.

基于 https://docs.typo3.org/typo3cms/CoreApiReference/8.7/ApiOverview/Database/QueryBuilder/

中的文档

我创建了类似的东西:


    /** @var \TYPO3\CMS\Core\Database\Query\QueryBuilder $queryBuilder */
    $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('domain_model_topic');
    $queryBuilder->getRestrictions()->removeAll();
    $queryBuilder
        ->select('*')
        ->from('domain_model_post')
        ->from('domain_model_topic')
        ->where(
            $queryBuilder->expr()
                ->eq('domain_model_topic.uid', 'domain_model_post.topic') . ' AND ' .
            $queryBuilder->expr()
                ->like('domain_model_topic.title', $queryBuilder->createNamedParameter('%' . $queryBuilder->escapeLikeWildcards($search->getSWord()) . '%')) . ' OR ' .
            $queryBuilder->expr()
                ->like('domain_model_post.text', $queryBuilder->createNamedParameter('%' . $queryBuilder->escapeLikeWildcards($search->getSWord()) . '%'))
        );
    $test = $queryBuilder->execute()->fetchAll();

但是此代码会导致错误 Allowed memory size of XXX bytes exhausted 对于任何分配的内存数

我尝试重写查询以使其更简单(没有 $queryBuilder->expr():


    $queryBuilder
        ->select('*')
        ->from('domain_model_post')
        ->from('domain_model_topic')
        ->where(
    "domain_model_topic.uid = domain_model_post.topic
    AND (domain_model_topic.title LIKE '%" . $variableStringFromUser . "%'
    OR domain_model_post.text LIKE '%" . $variableStringFromUser . "%')"
    );

它可以工作,但存在严重的安全问题,然后我尝试添加 $queryBuilder->createNamedParameter($variableStringFromUser) 那没有用

我的目标是通过论坛的搜索词创建来自一个 table 和另一个 post 的主题的搜索。我不能使用左连接,因为它有严重的性能问题,并且在 mysql 中进行一些测试后,来自两个 table 的 select 给出了最好的结果(并且在 mysql 中工作)

我能做些什么来以安全的方式(并且尽可能干净)从 typo3_8 中的 post 开始创建查询(最好使用查询生成器)

经过长时间的尝试,我找到了创建快速运行的查询的解决方案。


    $queryBuilder
        ->select('*')
        ->from('domain_model_post')
        ->from('domain_model_topic')
        ->orWhere(
            $queryBuilder->expr()->like('domain_model_topic.title', $queryBuilder->createNamedParameter('%' . $queryBuilder->escapeLikeWildcards($search->getSWord()) . '%')),
            $queryBuilder->expr()
                ->like('domain_model_post.text', $queryBuilder->createNamedParameter('%' . $queryBuilder->escapeLikeWildcards($search->getSWord()) . '%'))
        )
        ->andWhere(
            $queryBuilder->expr()->eq('domain_model_topic.uid', 'domain_model_post.topic')
        );

查询此代码:


    SELECT 
        *
    FROM
        `domain_model_post`,
        `domain_model_topic`
    WHERE
        ((`domain_model_topic`.`title` LIKE '%test%')
            OR (`domain_model_post`.`text` LIKE '%test%'))
            AND (`domain_model_topic`.`uid` = domain_model_post.topic)

它的工作速度比以前的查询快一百倍。我建议大家尝试使用 doable fromwhere 而不是 join

来优化文本搜索