如何使用AND查询创建一个select子句,该查询将tx_news项与两个或多个相关类别匹配

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

我尝试创建一个查询来获取所有新闻项目,这些新闻项目至少标记了两个不同的类别,并且必须与AND子句匹配。

如果应该呈现以下代码,我需要此查询来做出决定。例如。如果没有类别A和类别B的新闻项,则不执行任何操作。否则显示tx_news LIST视图。

lib.field_dmnewsplugin.5 = CONTENT 
lib.field_dmnewsplugin.5 {
    table = tx_news_domain_model_news
    select {
        pidInList = 124
        max = 9
        orderBy = uid DESC

        leftjoin = sys_category_record_mm ON (sys_category_record_mm.uid_foreign = tx_news_domain_model_news.uid)
        #andWhere = sys_category_record_mm.uid_local IN (14,16)
        #where = sys_category_record_mm.uid_local = 14
        andWhere = sys_category_record_mm.uid_local = 14 AND sys_category_record_mm.uid_local = 16
    }
    renderObj = COA
    renderObj {
        1 = TEXT
        1.value = Aktuelles
        1.wrap = <h2>|</h2>
        2 = TEXT
        2.field = title
        2.crop = 50|...|1
        2.wrap = <h3>|</h3>
        3 = TEXT
        3.field = teaser
        3.crop = 500|...|1
        3.wrap = <p>|</p>
        }
    }

我的代码是一些测试的结果。使用“andWhere”子句,结果为空。没有任何where子句,我得到所有新闻项的双重条目,因为它们都至少有两个不同的类别。我的目标是为每个新闻项目获得独特的结果,标记为类别A和类别B(并且可能作为其他类别的通用解决方案)。

我需要做什么?

先感谢您,

拉尔夫

select typo3 categories typoscript tx-news
2个回答
0
投票

尝试将WHERE子句放入JOIN的ON部分,并使用groupBy来获取计数器。

select {
    selectFields = count(*) AS counter
    leftjoin = sys_category_record_mm ON (sys_category_record_mm.uid_foreign = tx_news_domain_model_news.uid) AND sys_category_record_mm.uid_local IN (14,16)
    pidInList = 124
    max = 9
    groupBy = uid
    orderBy = uid DESC
    where = counter > 1
}

0
投票

在我必须意识到,Jo的解决方案对我不起作用之后,我有了另一个想法:

lib.field_dmnewsplugin = COA
    lib.field_dmnewsplugin {
        10 = CONTENT 
        10 {
            table = tx_news_domain_model_news
            select {
                selectFields = title, teaser, count(uid) AS counter
                leftjoin = sys_category_record_mm ON (sys_category_record_mm.uid_foreign = tx_news_domain_model_news.uid) AND sys_category_record_mm.uid_local IN ({14,###maincat###)
                pidInList = 124
                max = 1
                groupBy = uid
                orderBy = counter DESC, crdate DESC
                #where = counter > 1
                markers {
                    maincat.value = 16
                    }
                }
            renderObj = COA
            renderObj {
                10 = COA
                10 {
                    stdWrap {
                        if {
                            value = 1
                            isGreaterThan.data = field:counter
                            #equals.data = field:counter
                            }
                        required = 1
                        wrap = <h2>Some Headline</h2>
                        }
                    10 = USER
                    10 {
                        userFunc = TYPO3\CMS\Extbase\Core\Bootstrap->run
                        extensionName = News
                        pluginName = Pi1
                        vendorName = GeorgRinger

                        switchableControllerActions {
                            News {
                                1 = list
                                }
                            }
                        settings < plugin.tx_news.settings
                        settings {
                            cropMaxCharacters = 164 | &nbsp;[...] | 1
                            categoryConjunction = and
                            categories = 14,16
                            excludeAlreadyDisplayedNews = 1
                            archiveRestriction = active
[...]

问题是,我们不能在where子句中使用别名“counter”,我不知道如何用typoscript解决问题。使用本机SQL可能有更好的方法。

但我能够获得“计数器”的价值来创建“if”规则。另外,我可以通过“counter”对查询进行排序。因此,如果查询返回至少一个“counter”大于1的匹配,我可以决定使用标题呈现COA-Object,就像新闻列表视图一样。

我对这个解决方案很满意。但也许,有人对我有特别的伎俩吗?

谢谢你的帮助,

拉尔夫

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