基于两个没有连接的表查询结果
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 from
和 where
而不是 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 from
和 where
而不是 join