TYPO3通过sys_categor获取页面(y / ies)

时间:2016-01-27 14:10:57

标签: sql typo3 typoscript

我需要你的帮助,我看不到森林里的树木。 请考虑以下情形:

TYPO3 - 系统,例如2页。 (关于我们和服务) 此外,我有3个系统类别(Cat 1,Cat 2 Cat 3)

页面关于我们,类别“Cat 1”& “猫2”。 页面服务的类别为“Cat 2”& “猫3”。

现在我需要在typoscript中使用SELECT查询,我只能获得“Cat 3”和“Cat 2”(在这种情况下它将是页面服务)的页面。

但是,让我们从简单的SQL开始,而不是使用Typoscript查询。

针对这种情况,TYPO3中存在以下3个表:

“pages”,“sys_category”,“sys_category_record_mm”

pages - table:
+-----+----------+------------+
| uid |  title   | categories |
+-----+----------+------------+
|   3 | About us |          2 |
|   4 | Services |          2 |
+-----+----------+------------+


sys_category - table:
+-----+-------+
| uid | title |
+-----+-------+
|   1 | Cat 1 |
|   2 | Cat 2 |
|   3 | Cat 3 |
+-----+-------+


sys_category_record_mm - table:
+-----------+-------------+------------+
| uid_local | uid_foreign | tablenames |
+-----------+-------------+------------+
|         2 |           4 | pages      |
|         2 |           3 | pages      |
|         1 |           4 | pages      |
|         3 |           3 | pages      |
+-----------+-------------+------------+

现在我有一个简单的SQL查询,它输出所有有类别的页面,如下所示:

SELECT DISTINCT title FROM pages
JOIN sys_category_record_mm ON sys_category_record_mm.uid_foreign = pages.uid
WHERE sys_category_record_mm.tablenames = 'pages'

这将让我得到以下输出:

+----------+
|  title   |
+----------+
| Services |
| About us |
+----------+

但现在我想只有“服务”页面,其中包含“Cat 2”类别和“Cat 3”类别。

我如何修改查询以仅获取包含两个类别的页面。

我尝试了类似的东西,但我知道这不起作用,因为OR条件我仍然会得到这两个页面。

SELECT DISTINCT title FROM pages
JOIN sys_category_record_mm ON sys_category_record_mm.uid_foreign = pages.uid
WHERE sys_category_record_mm.tablenames = 'pages' AND (sys_category_record_mm.uid_local = 2 OR sys_category_record_mm.uid_local = 3)

提前致谢!!

我很感谢每一个提示。

2 个答案:

答案 0 :(得分:1)

您必须使用GROUP BY将查询限制为具有特定uid的行,然后使用必须仅从组中选择与您的条件匹配的行。

请考虑以下事项:

SELECT DISTINCT pages.title, uid_local, uid_foreign FROM pages
JOIN sys_category_record_mm ON sys_category_record_mm.uid_foreign = pages.uid
WHERE sys_category_record_mm.tablenames = 'pages'

给出这个结果

+----------+-----------+-------------+
| title    | uid_local | uid_foreign |
+----------+-----------+-------------+
| Services | 2         | 53          | 
| Services | 3         | 53          |
| About Us | 1         | 54          |
| About Us | 2         | 54          |
+----------+-----------+-------------+
SELECT DISTINCT pages.title FROM pages
JOIN sys_category_record_mm ON sys_category_record_mm.uid_foreign = pages.uid
WHERE sys_category_record_mm.tablenames = 'pages'
GROUP BY sys_category_record_mm.uid_local
HAVING sys_category_record_mm.uid_local = 2 or sys_category_record_mm.uid_local = 3

这给了我

+--------+
|Title   |
+--------+
|Services|
+--------+

答案 1 :(得分:1)

感谢Marcus Schwemer,他指出了解决方案.. 感谢pgampe给你回答!

我已经使用类别菜单完成了它。 就像Marcus说的那样:“生成的页面数组中的每一个都会获得一个包含页面所属类别列表的键_categories的附加条目,作为逗号分隔的uid列表。可以使用stdWrap.field或getText来访问它们。其他领域。“

很容易在菜单中执行if条件,如:

20 = HMENU
20 {
    special = categories
    # Show all pages with categories 1, 2 and 3
    special.value = 1,2,3
    1 = TMENU
    1.NO {
        # get comma-separated list of uid's of the categories the page belongs to
        stdWrap.field = _categories
        # check the _categories field if it contains the categories you need.
        stdWrap.if {
            value = 2,3
            equals.field = _categories
        }
    }
}

这就是......