Как создать предложение select с запросом AND, которое сопоставляет элементы tx_news с двумя или более связанными категориями

Я пытаюсь создать запрос, чтобы получить все новости, помеченные как минимум двумя разными категориями, и они должны соответствовать предложению AND.

Мне нужен этот запрос, чтобы принять решение, следует ли отображать следующий код или нет. Например. Если новости с категорией А и категорией Б нет, ничего не делать. В противном случае показать 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 (и, возможно, в качестве универсального решения дополнительные категории).

Что мне нужно сделать?

Заранее спасибо,

Ральф


person Waimanu    schedule 08.02.2019    source источник
comment
К вашему сведению: andWhere устарела, начиная с TYPO3 CMS v7, и больше не существует, начиная с TYPO3 CMS v8.   -  person Stefan Padberg    schedule 10.02.2019
comment
Спасибо за информацию, вы правы.   -  person Waimanu    schedule 14.02.2019


Ответы (2)


Попробуйте поместить предложение WHERE в часть ON JOIN и использовать 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
}
person Jo Hasenau    schedule 09.02.2019
comment
Большое спасибо за ваше предложение! Я понимаю что ты имеешь в виду. Но теперь я получаю следующую ошибку: Неизвестный столбец «счетчик» в «где пункт». Любая идея, как я могу избавиться от этого? Заранее спасибо, Ральф - person Waimanu; 14.02.2019
comment
Кстати. Без предложения where я получаю результаты. Я отображаю счетчик, и он показывает количество добавленных категорий 1 или 2. Я хотел бы видеть элементы со счетчиком = 2. Но, конечно же, без работающего фильтра он показывает все записи. - person Waimanu; 14.02.2019

После того, как мне пришлось понять, что решение Джо мне не подходит, у меня появилась другая идея:

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, и я понятия не имею, как я могу решить проблему с typoscript. С собственным SQL может быть лучший способ.

Но я могу получить значение «счетчика», чтобы создать правило «если». И дополнительно я могу отсортировать запрос по «счетчику». Таким образом, если запрос возвращает хотя бы одно обращение со значением «счетчик» больше 1, я могу решить отобразить COA-Object как представление списка новостей с заголовком.

Я доволен этим решением. Но, может быть, у кого-то есть для меня особая хитрость?

Спасибо за вашу помощь,

Ральф

person Waimanu    schedule 15.02.2019